博客
关于我
Spirng集成ActiveMQ
阅读量:548 次
发布时间:2019-03-09

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

使用Spirng集成ActiveMQ:

1.ConnectionFactory:用于管理连接的连接工厂

2.JmsTemplate:用于发送和接受消息的模板类

3.MessageListener:消息监听器

ConnectionFactory:

1.一个Spring提供的连接池

2.JmsTemplate每次发消息都会重新创建连接,会话和productor

3.Spring中提供了SingleConnectionFactory和CachingConnectionFactory

JmsTemplate:

1.由Spring提供,只需要向Spring容器注册这个类就能使用JmsTemplate方便的操作jms

MessageListerner:

1.实现一个onMessage方法,该方法只接受一个Message参数。

队列模式

1.首先导入jar包,这里我用的是maven

org.apache.activemq
activemq-all
5.7.0
org.apache.activemq
activemq-core
5.7.0
org.springframework
spring-jms
4.2.5.RELEASE
org.apache.activemq
activemq-pool
5.7.0
org.springframework
spring-context
4.2.5.RELEASE
org.springframework
spring-test
4.2.5.RELEASE
test
org.springframework
spring-test
5.0.6.RELEASE
compile

Spring与AMQ的配置文件:

1.因为有重合部分所以单独做了一个Commen配置:(spring-amq-commen.xml)

tcp://192.168.1.6:61616

2.发送者:(spring-amq-producer.xml)

3.接受者:(spring-amq-consumer.xml)

因为有用到JmsTemplate所以先定义一个接口:

package com.zzf.spring.jms.service;public interface ProducerServic {    public void sendMsg(String message);}

实现类:

package com.zzf.spring.jms.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jms.core.JmsTemplate;import org.springframework.jms.core.MessageCreator;import org.springframework.stereotype.Service;import javax.annotation.Resource;import javax.jms.*;@Servicepublic class ProducerServiceImpl implements ProducerServic {    @Autowired    JmsTemplate jmsTemplate;    @Resource(name = "destinationQueue")    Destination destination;    public void sendMsg(final String message) {        //使用JmsTemplate发送消息        jmsTemplate.send(destination, new MessageCreator() {          //创建一个消息            public Message createMessage(Session session) throws JMSException {                TextMessage textMessage = session.createTextMessage(message);                return textMessage;            }        });        System.out.println("发送消息"+message);    }}

启动类(生产者):

package com.zzf.spring.jms.service;import org.springframework.context.support.ClassPathXmlApplicationContext;class AppProducer {    public static void main(String[] args) {        //读取配置文件        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring-amq-producer.xml");        //ProducerServic producerServic= context.getBean(ProducerServic.class);//通过获取class的方式获取bean        ProducerServic producerServic= (ProducerServic) context.getBean("producerServiceImpl");        for (int i = 0; i < 10; i++) {            producerServic.sendMsg("Spring-test="+i);        }        context.close();    }}

启动后可以看到:

消费者需要实现MessageListerner做消息监听器:

package com.zzf.spring.jms.service;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;public class MyMessageListener implements MessageListener {    public void onMessage(Message msg) {        if (msg instanceof TextMessage) {            try {                TextMessage txtMsg = (TextMessage) msg;                String message = txtMsg.getText();                System.out.println("消息内容: " + message);            } catch (JMSException e) {                throw new RuntimeException(e);            }        } else {            throw new IllegalArgumentException("Message must be of type TextMessage");        }    }}

启动类:

package com.zzf.spring.jms.service;import org.springframework.context.support.ClassPathXmlApplicationContext;public class AppConsumer {    public static void main(String[] args) {        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring-amq-consumer.xml");    }}
启动后:

OK……Spring与AMQ的队列模式就这么能用了

主题模式

1.修改xml文件添加主题模式:commen.xml

tcp://192.168.1.6:61616

修改配置容器,增加一个topic.xml

原来的consumer.xml如下所示:

修改接口:

package com.zzf.spring.jms.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jms.core.JmsTemplate;import org.springframework.jms.core.MessageCreator;import org.springframework.stereotype.Service;import javax.annotation.Resource;import javax.jms.*;@Servicepublic class ProducerServiceImpl implements ProducerServic {    @Autowired    JmsTemplate jmsTemplate;    @Resource(name = "destinationQueue")    Destination destination;    @Resource(name = "destinationTopic")    Destination destinationTopic;    public void sendMsg(final String message) {        //使用JmsTemplate发送消息        jmsTemplate.send(destination, new MessageCreator() {            //创建一个消息            public Message createMessage(Session session) throws JMSException {                TextMessage textMessage = session.createTextMessage(message);                return textMessage;            }        });        System.out.println("发送消息"+message);    }    public void sendMsgTopic(final String message) {        //使用JmsTemplate发送消息        jmsTemplate.send(destinationTopic, new MessageCreator() {            //创建一个消息            public Message createMessage(Session session) throws JMSException {                TextMessage textMessage = session.createTextMessage(message);                return textMessage;            }        });        System.out.println("发送消息"+message);    }}

只需要修改Resource的name也行

发布者启动类代码:

package com.zzf.spring.jms.service;import org.springframework.context.support.ClassPathXmlApplicationContext;public class AppTopicProducer {    public static void main(String[] args) {        //读取配置文件        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring-amq-producer.xml");        //ProducerServic producerServic= context.getBean(ProducerServic.class);//通过获取class的方式获取bean        ProducerServic producerServic= (ProducerServic) context.getBean("producerServiceImpl");        for (int i = 0; i < 10; i++) {            producerServic.sendMsgTopic("Spring-test="+i);        }        context.close();    }}
订阅者启动类代码:
package com.zzf.spring.jms.service;import org.springframework.context.support.ClassPathXmlApplicationContext;public class AppTopicConsumer {    public static void main(String[] args) {        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring-amq-topic.xml");    }}

效果显示:

每个订阅者都收到了发布者发送的消息~

你可能感兴趣的文章
mysql CPU使用率过高的一次处理经历
查看>>
Multisim中555定时器使用技巧
查看>>
MySQL CRUD 数据表基础操作实战
查看>>
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>
MySQL DBA 进阶知识详解
查看>>
Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)
查看>>
Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
查看>>
mysql deadlock found when trying to get lock暴力解决
查看>>
MuseTalk如何生成高质量视频(使用技巧)
查看>>
mutiplemap 总结
查看>>
MySQL DELETE 表别名问题
查看>>
MySQL Error Handling in Stored Procedures---转载
查看>>
MVC 区域功能
查看>>
MySQL FEDERATED 提示
查看>>
mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
查看>>
Mysql group by
查看>>