Spring 与JMS发送消息

一、Spring 与JMS发送消息

Java消息服务(Java Message Service ,JMS)是一个Java标准,定义了使用消息代理的通用API。在JMS出现之前,每个消息代理都有私有的API,这就使得不同代理之间的消息代码很难通用。但是借助JMS,所有遵从规范的实现都使用通用的接口,这就类似于JDBC为数据库操作提供了通用的接口一样。

Spring通过基于模板的抽象为JMS功能提供了支持,这个模板也就是JmsTemplate。使用JmsTemplate,能够非常容易地在消息生产方发送队列和主题消息,在消费消息的那一方,也能够非常容易地接收这些消息。Spring还提供了消息驱动POJO的理念:这是一个简单的Java对象,它能够以异步的方式响应队列或主题上到达的消息。

1.1 在Spring中搭建消息代理

ActiveMQ是一个伟大的开源消息代理产品,也是使用JMS进行异步消息传递的最佳选择。
在开始使用ActiveMQ之前,我们需要从http://activemq.apache.org下载二进制发行包。下载完ActiveMQ后,我们将其解压缩到本地硬盘中。在解压目录中,我们会找到文件activemq-core-5.9.1.jar。为了能够使用ActiveMQ的API,我们需要将此JAR文件添加到应用程序的类路径中。

在bin目录下,我们可以看到为各种操作系统所创建的对应子目录。在这些子目录下,我们可以找到用于启动ActiveMQ的脚本。例如,要在OS X下启动ActiveMQ,我们只需要在“bin/macosx”目录下运行activemq start。运行脚本后,ActiveMQ就准备好了,这时可以使用它作为消息代理。

创建连接工厂

因为选择了ActiveMQ作为我们的消息代理,所以我们必须配置JMS连接工厂,让它知道如何连接到ActiveMQ。ActiveMQConnectionFactory是ActiveMQ自带的连接工厂,在Spring中可以使用如下方式进行配置:
在这里插入图片描述

或者使用ActiveMQ自己的Spring配置命名空间来声明连接工厂(适用于ActiveMQ 4.1之后的所有版本):
在这里插入图片描述

声明ActiveMQ消息目的地

除了连接工厂外,我们还需要消息传递的目的地。目的地可以是一个队列,也可以是一个主题,这取决于应用的需求。

例如,下面的<bean>声明定义了一个ActiveMQ队列:在这里插入图片描述

下面的<bean>声明定义了一个ActiveMQ主题:
在这里插入图片描述

1.2 使用Spring的JMS模板

JmsTemplate可以创建连接、获得会话以及发送和接收消息。这使得我们可以专注于构建要发送的消息或者处理接收到的消息。

为了使用JmsTemplate,我们需要在Spring的配置文件中将它声明为一个bean。如下的XML可以完成这项工作:
在这里插入图片描述

发送消息

在这里插入图片描述

与其每次发送消息时都指定一个目的地,不如我们为JmsTemplate装配一个默认的目的地:
在这里插入图片描述
如果你想指定要创建的目的地类型的话,那么你可以将之前创建的队列或主题的目的地bean装配进来:
在这里插入图片描述
现在,调用JmsTemplate的send()方法时,我们可以去除第一个参数了:
在这里插入图片描述

接收消息

当调用JmsTemplate的receive()方法时,JmsTemplate会尝试从消息代理中获取一个消息。如果没有可用的消息,receive()方法会一直等待,直到获得消息为止。

在这里插入图片描述

1.3 创建消息驱动的POJO

创建消息监听器

在这里插入图片描述

配置消息监听器

为POJO赋予消息接收能力的诀窍是在Spring中把它配置为消息监听器。Spring的jms命名空间为我们提供了所需要的一切。首先,让我们先把处理器声明为bean:
在这里插入图片描述
然后,为了把SpittleAlertHandler转变为消息驱动的POJO,我们需要把这个bean声明为消息监听器:
在这里插入图片描述

1.4 使用基于消息的RPC

为了支持基于消息的RPC,Spring提供了JmsInvokerServiceExporter,它可以把bean导出为基于消息的服务;为客户端提供了JmsInvokerProxyFactoryBean来使用这些服务。

导出基于JMS的服务

在这里插入图片描述
AlertServiceImpl是一个简单的POJO,没有任何迹象标示它要用来处理JMS消息。它只是实现了简单的AlertService接口,该接口如下所示:
在这里插入图片描述
正如我们所看到的,AlertServiceImpl使用了@Component注解来标注,所以它会被Spring自动发现并注册为Spring应用上下文中ID为alertService的bean。在配置JmsInvokerServiceExporter时,我们将引用这个bean:
在这里插入图片描述
这个bean的属性描述了导出的服务应该是什么样子的。service属性设置为alertServicebean的引用,它是远程服务的实现。同时,serviceInterface属性设置为远程服务对外提供接口的全限定类名。

导出器的属性并没有描述服务如何基于JMS通信的细节。但好消息是JmsInvokerServiceExporter可以充当JMS监听器。因此,我们使用<jms:listenercontainer>元素配置它:
在这里插入图片描述

使用基于JMS的服务

这时候,基于JMS的提醒服务已经准备好了,等待队列中名字为spitter.alert.queue的RPC消息到达。在客户端,JmsInvokerProxyFactoryBean用来访问服务。

为了使用提醒服务,我们可以像下面那样配置JmsInvokerProxyFactoryBean:
在这里插入图片描述
connectionFactory和queryName属性指定了RPC消息如何被投递——在这里,也就是在给定的连接工厂中,我们所配置的消息代理里面名为spitter.alert.queue的队列。对于serviceInterface,指定了代理应该通过AlertService接口暴露功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书香水墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值