博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring JMS的使用
阅读量:5737 次
发布时间:2019-06-18

本文共 5671 字,大约阅读时间需要 18 分钟。

Spring JMS简介

我们都知道使用Spring可以简化我们的开发,同样的使用Spring也可以集成JMS来连接ActiveMQ,这里说明一下几个需要用到的类:

1.首先是 ConnectionFactory 的实现类,Spring封装了两个连接工厂的实现类。因为JmsTemplate每次发消息都会重新创建连接、会话和productor,所以Spring提供的这两个实现类都是具有连接池的功能的。这两个实现类分别是 SingleConnectionFactory 和 CachingConnectionFactory:

SingleConnectionFactory:对于建立JMS服务器链接的请求只会一直返回同一个Connection,并且会忽略Connection的close方法调用。(org.springframework.jms.connection.SingleConnectionFactory)

CachingConnectionFactory:继承了SingleConnectionFactory,所以它拥有SingleConnectionFactory的所有功能,同时它还新增了缓存功能,它可以缓存Session、MessageProducer和MessageConsumer。(org.springframework.jms.connection.CachingConnectionFactory)

2.JmsTemplate 这是Spring提供的用于发送和接收消息的模板类,只需向Spring容器内注册这个类就可以使用JmsTemplate方便的操作jms,JmsTemplate 类是线程安全的,我们可以在整个应用范围使用。

3.MessageListener 消息监听器,实现一个onMessage方法,该方法只接受一个Message参数,在该方法内对消息进行处理。


Spring JMS的使用_1

创建一个Maven工程,在pom.xml文件中,添加如下依赖:

4.2.5.RELEASE
junit
junit
4.12
org.springframework
spring-context
${spring.version}
org.springframework
spring-jms
${spring.version}
org.springframework
spring-test
${spring.version}
org.apache.activemq
activemq-core
5.7.0
org.springframework
spring-context

然后创建Spring的配置文件,不同的角色我们希望使用不同的配置文件,但这些配置文件有些配置是一致的,所以我们先创建一个通用的配置文件把可复用的部分抽取出来,内容如下:

然后创建消息生产者的配置文件,内容如下:

基本的配置完成之后,我们先来创建消息发送服务。新建一个 ProducerService 接口,代码如下:

package org.zero01.jms.producer;public interface ProducerService {    void sendMessage(String message);}

新建该接口的实现类,代码如下:

package org.zero01.jms.producer;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jms.core.JmsTemplate;import org.springframework.stereotype.Service;import javax.annotation.Resource;import javax.jms.Destination;import javax.jms.TextMessage;/** * @program: jms-spring * @description: 消息发送服务 * @author: 01 * @create: 2018-05-27 09:28 **/@Service("producerService")public class ProducerServiceImpl implements ProducerService {    @Autowired    private JmsTemplate jmsTemplate;    @Resource(name = "queueDestination")    private Destination destination;    /**     * 发送消息     * @param message     */    public void sendMessage(String message) {        // 使用JmsTemplate来发送消息        jmsTemplate.send(destination, (session) -> {            // 创建一个文本类型的消息体            return session.createTextMessage(message);        });        System.out.println("发送消息: " + message);    }}

然后新建一个消息生产者,代码如下:

package org.zero01.jms.producer;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * @program: jms-spring * @description: 消息生产者 * @author: 01 * @create: 2018-05-27 10:11 **/public class AppProducer {    public static void main(String[] args) {        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");        ProducerService producerService = (ProducerService) context.getBean("producerService");        for (int i = 0; i < 100; i++) {            producerService.sendMessage("test" + i);        }        context.close();    }}

运行消息生产者的代码,到ActiveMQ管理界面上,确认消息已发送到队列中,如下:

Spring JMS的使用

如此一来,我们的消息生产者就开发好了。


Spring JMS的使用_2

在上文中,我们已经开发好了生产者,并且也成功发送了消息到队列中。我们接下来开发一个消费者来消费这些消息,首先我们需要实现消息监听器接口:

package org.zero01.jms.consumer;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;/** * @program: jms-spring * @description: 消费者消息监听器 * @author: 01 * @create: 2018-05-27 10:51 **/public class ConsumerMessageListener implements MessageListener {    /**     * 接收消息     * @param message     */    public void onMessage(Message message) {        TextMessage textMessage = (TextMessage) message;        try {            System.out.println("接收消息: " + textMessage.getText());        } catch (JMSException e) {            e.printStackTrace();        }    }}

然后新建一个运行类,作为我们的消息消费者。代码如下:

package org.zero01.jms.consumer;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * @program: jms-spring * @description: 消息消费者 * @author: 01 * @create: 2018-05-27 10:57 **/public class AppConsumer {    public static void main(String[] args){        ApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");    }}

新建consumer.xml配置文件,配置内容如下:

运行消息消费者的代码,到ActiveMQ管理界面上,确认能够成功从消息队列中消费消息,如下:

Alt text

如此一来,我们的消息消费者也开发好了。


Spring JMS的使用_3

以上演示的是队列模式的开发,接下来我们简单演示一下主题模式。主题模式的代码和队列模式的代码几乎是一样的,区别只在于目的地的配置。在common.xml配置文件中,新增主题模式的目的地:

修改consumer.xml配置文件中,目的地的配置:

最后修改一下 ProducerServiceImpl 实现类中,指定注入的目的地名称:

...@Service("producerService")public class ProducerServiceImpl implements ProducerService {    @Resource(name = "topicDestination")    private Destination destination;    ...}

完成以上修改后,就已经从队列模式切换到主题模式了。接下来进行一个简单的测试,由于是主题模式的原因,所以我们先运行消费者的代码,然后再运行生产者的代码。运行完毕后,到ActiveMQ管理界面上,确认消费者能够成功从主题中订阅消息,如下:

Spring JMS的使用

转载于:https://blog.51cto.com/zero01/2120753

你可能感兴趣的文章
7、设计模式-创建型模式-建造者模式
查看>>
Cesium官方教程11--建模人员必读
查看>>
我国古代的勾股定理
查看>>
Linux下的C编程实战
查看>>
[32期] html中部分代码与英语单词关系
查看>>
PHP安装环境,服务器不支持curl_exec的解决办法
查看>>
Count and Say
查看>>
9.1(java学习笔记)正则表达式
查看>>
fopen打开文件失败的问题
查看>>
Spring系列之DI的原理及手动实现
查看>>
阿里蚂蚁金服五面,血与泪的经验总结(附面试答案)
查看>>
深度学习的seq2seq模型
查看>>
如何让你的传输更安全——NIO 模式和 BIO 模式实现 SSL 协议通信
查看>>
[译] 图解 React Native
查看>>
腾讯喻帅:腾讯云智慧零售产品发布
查看>>
一次被僵尸网络病毒攻击的过程
查看>>
Java高级特性增强-锁
查看>>
CNCF案例研究:PingCAP
查看>>
Python的新式类和经典类
查看>>
公用事业公司正在转向云计算
查看>>