博客
关于我
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 常用命令
查看>>
Mysql 常见ALTER TABLE操作
查看>>
MySQL 常见的 9 种优化方法
查看>>
MySQL 常见的开放性问题
查看>>
Mysql 常见错误
查看>>
mysql 常见问题
查看>>
MYSQL 幻读(Phantom Problem)不可重复读
查看>>
mysql 往字段后面加字符串
查看>>
mysql 快速自增假数据, 新增假数据,mysql自增假数据
查看>>
Mysql 批量修改四种方式效率对比(一)
查看>>
Mysql 报错 Field 'id' doesn't have a default value
查看>>
MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
查看>>
Mysql 拼接多个字段作为查询条件查询方法
查看>>
mysql 排序id_mysql如何按特定id排序
查看>>
Mysql 提示:Communication link failure
查看>>
mysql 插入是否成功_PDO mysql:如何知道插入是否成功
查看>>
Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
查看>>
mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
查看>>
mysql 数据库备份及ibdata1的瘦身
查看>>
MySQL 数据库备份种类以及常用备份工具汇总
查看>>