现在任何一个框架的使用都会结合spring框架,quartz、cxf与平时常见的Hibernate、mybatis、Struts等都可以与spring集成起来使用,在这里研究了activemq结合spring的使用方法。

1.理论篇

  spring集成JMS连接ActiveMq

    ConnectionFactory:用于管理连接的工厂(Spring为我们提供的连接池,因为JmsTemplate每次发消息都会重新创建连接、会话和producer,这个操作非常消耗性能,所以Spring提供了连接池)

      spring提供了两个实现类:SingleConnectionFactory--整个应用使用同一个Connection进行操作,并且重写了其close()方法

                  CachingConnectionFactory--继承自SingleConnectionFactory,所以有SingleConnectionFactory的所有功能,并且额外提供了缓存功能,可以缓存Session、producer、consumer等。

    JmsTemplate:用于接收和发送消息的模板。Spring提供的,我们只需要向spring容器注册这个类就可以使用JmsTemplate方便的操作JMS。JmsTemplate类是线程安全的,可以在整个范围内使用,而且我们可以注册多个JmsTemplate到spring中。

    MessageListener:消息监听器。需要我们手动实现,只需要实现一个omMessage(Message message)方法。

2.代码实现spring集成activemq

0.pom.xml配置与目录结构与log4j.properties

log4j.rootLogger=info,B,Alog4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%nlog4j.appender.B=org.apache.log4j.RollingFileAppender
log4j.appender.B.File=E:\\jms.log
log4j.appender.B.MaxFileSize=10MB
log4j.appender.B.MaxBackupIndex=5
log4j.appender.B.layout=org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.qlq</groupId><artifactId>jms-spring</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>jms-spring Maven Webapp</name><!-- 版本管理 --><properties><springframework>4.1.8.RELEASE</springframework></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency><!-- JSP相关 --><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><scope>provided</scope><version>2.5</version></dependency><!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${springframework}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${springframework}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${springframework}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${springframework}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>${springframework}</version></dependency><!-- xbean 如<amq:connectionFactory /> --><dependency><groupId>org.apache.xbean</groupId><artifactId>xbean-spring</artifactId><version>3.16</version></dependency><!-- activemq --><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-core</artifactId><version>5.7.0</version></dependency><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-pool</artifactId><version>5.12.1</version></dependency><!-- slf4j--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.12</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.5</version></dependency></dependencies><build><finalName>Crawl-Page</finalName><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><configuration><port>8080</port><path>/</path></configuration></plugin></plugins></build></project>

1.队列模式的MQ实现(Destination设置为ActiveMQQueue即可)

ApplicationContext-all.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!--配置扫描注解的包--><context:component-scan base-package="cn.qlq.jms" ></context:component-scan><!--Spring为我们提供的ConnectionFactory--><bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"><property name="brokerURL" value="tcp://localhost:61616"></property></bean><!--Spring jms为我们提供的连接池--><bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory"><property name="targetConnectionFactory" ref="targetConnectionFactory"/></bean><!--一个队列的目的地,构造方法指定queueName,点对点模式--><bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue"><constructor-arg value="queue"></constructor-arg></bean><!--spring JMS提供的JmsTemplate--><bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="connectionFactory"/></bean><!--消费消息容器(需要注入连接工厂,目的地,消息消费者监听器)--><bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"><property name="connectionFactory" ref="connectionFactory"/><property name="destination" ref="queueDestination"/><property name="messageListener" ref="myConsumer"/></bean>
</beans>

生产者接口和实现类:

package cn.qlq.jms.producer;/*** @Author: qlq* @Description* @Date: 21:25 2018/9/27*/
public interface MyProducer {void sendMessage(String message);
}

package cn.qlq.jms.producer;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;import javax.jms.*;/*** @Author: qlq* @Description* @Date: 21:26 2018/9/27*/@Service
public class MyProducerImpl implements MyProducer {private static final Logger logger = LoggerFactory.getLogger(MyProducerImpl.class);@Autowiredprivate JmsTemplate jmsTemplate;@Autowired@Qualifier("queueDestination")private Destination destination;public void sendMessage(final String message) {jmsTemplate.send(destination, new MessageCreator() {public Message createMessage(Session session) throws JMSException {TextMessage textMessage = session.createTextMessage(message);return textMessage;}});logger.info("send textMesage:{}",message);}
}

消费消息监听器代码:

package cn.qlq.jms.producer;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;/*** @Author: qlq* @Description* @Date: 22:36 2018/9/27*/
@Service
public class MyConsumer implements MessageListener {private static final Logger logger = LoggerFactory.getLogger(MyConsumer.class);public void onMessage(Message message) {TextMessage textMessage = (TextMessage) message;try {System.out.println("consumer message:"+ textMessage.getText());} catch (JMSException e) {logger.error("consume message error", e);}}
}

生产者启动类:启动spring容器,获取bean并且发布消息:

package cn.qlq.jms.producer;import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.springframework.context.ApplicationContext;/*** @Author: qlq* @Description 生产消息的入口类* @Date: 22:15 2018/9/27*/
public class ProducerApp {public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext-all.xml");
//        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext-all.xml");MyProducer myProducer = (MyProducer) applicationContext.getBean("myProducerImpl");for (int i = 0; i < 100; i++) {myProducer.sendMessage(" message"+i);}applicationContext.close();//关闭容器,会自动关闭所有的资源
    }
}

消费者启动类:启动spring容器,会自动监听目的地的消息:

package cn.qlq.jms.producer;import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;/*** @Author: qlq* @Description 消费消息的入口类* @Date: 22:15 2018/9/27*/
public class ConsumerApp {public static void main(String[] args) {//启动容器会自动消费消息ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext-all.xml");}
}

启动三个消费者一个生产者,查看控制台结果:(符合队列模式的特点:平均消费)

activemq后台查看结果:(已经停掉3个消费者线程所以消费者是0)

2.主题模式的MQ实现(Destination设置为ActiveMQQueue即可)

在Spring的xml配置文件中增加topic目的地,并且将消息监听的目的地设为topicDestination

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!--配置扫描注解的包--><context:component-scan base-package="cn.qlq.jms" ></context:component-scan><!--Spring为我们提供的ConnectionFactory--><bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"><property name="brokerURL" value="tcp://localhost:61616"></property></bean><!--Spring jms为我们提供的连接池--><bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory"><property name="targetConnectionFactory" ref="targetConnectionFactory"/></bean><!--一个队列的目的地,构造方法指定queueName,点对点模式--><bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue"><constructor-arg value="queue"></constructor-arg></bean><!--spring JMS提供的JmsTemplate--><bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="connectionFactory"/></bean><!--消费消息容器(需要注入连接工厂,目的地,消息消费者监听器)--><bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"><property name="connectionFactory" ref="connectionFactory"/><property name="destination" ref="topicDestination"/><property name="messageListener" ref="myConsumer"/></bean><!--一个队列的目的地,构造方法指定queueName,点对点模式--><bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic"><constructor-arg value="topic"></constructor-arg></bean>
</beans>

消息生产者将目的地注入为topicDestination

package cn.qlq.jms.producer;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;import javax.jms.*;/*** @Author: qlq* @Description* @Date: 21:26 2018/9/27*/@Service
public class MyProducerImpl implements MyProducer {private static final Logger logger = LoggerFactory.getLogger(MyProducerImpl.class);@Autowiredprivate JmsTemplate jmsTemplate;@Autowired@Qualifier("topicDestination")private Destination destination;public void sendMessage(final String message) {jmsTemplate.send(destination, new MessageCreator() {public Message createMessage(Session session) throws JMSException {TextMessage textMessage = session.createTextMessage(message);return textMessage;}});logger.info("send textMesage:{}",message);}
}

  剩下的测试代码同上,还是先开启三个消费者,再开启一个生产者,查看结果:(符合订阅模式特点:消费所有已经订阅的消息)

activemq后台查看结果:

Spring集成Activemq使用相关推荐

  1. Spring集成activeMQ

    <!-- 集成MQ BEGIN --><!-- MQ连接池 --><bean id="pooledConnectionFactory" class=& ...

  2. ActiveMq-关于Spring集成ActiveMq的连接池报错

    整合activeMQ,配置连接池,启动项目报错,JmsMessagingTemplate无法注入 //使用springboot2.0+及以下版本时候,maven配置依赖是: <dependenc ...

  3. ActiveMQ学习总结(3)——spring整合ActiveMQ

    2019独角兽企业重金招聘Python工程师标准>>> 1.参考文献 Spring集成ActiveMQ配置 Spring JMS异步发收消息 ActiveMQ 2.环境 在前面的一篇 ...

  4. ActiveMQ - spring集成jms

    2019独角兽企业重金招聘Python工程师标准>>> 前言 本文将实现spring与activemq的整合,主要演示怎么实现点对点和发布订阅通信模型,以及如何发送持久消息和实现持久 ...

  5. activimq java集成_Java消息队列-Spring整合ActiveMq

    1.概述 首先和大家一起回顾一下Java 消息服务,在我之前的博客<Java消息队列-JMS概述>中,我为大家分析了: 消息服务:一个中间件,用于解决两个活多个程序之间的耦合,底层由Jav ...

  6. apache camel_轻量级的开源集成:Apache Camel还是Spring集成?

    apache camel 首先,为全面披露信息,在过去的1.5年中, 我一直担任 FuseSource(现为Red Hat) 的顾问,为零售,运输,银行/金融等不同行业的大型和小型公司提供SOA和集成 ...

  7. 轻量级的开源集成:Apache Camel还是Spring集成?

    首先,为全面披露信息,在过去的1.5年中, 我一直担任 FuseSource(现为Red Hat) 的顾问,为零售,运输,银行/金融等不同行业的大型和小型公司提供SOA和集成项目支持.我的专长是使用该 ...

  8. activemq 开启监听_SpringBoot集成ActiveMQ怎么实现Topic发布/订阅模式通信?

    上一期我们讲了SpringBoot集成activeMQ实现Queue模式点对点通信,这一期我们接着讲SpringBoot集成activeMQ实现Topic发布/订阅模式通信. 发布/订阅模式通信是对点 ...

  9. Spring AMQP ActiveMQ教程

    Spring AMQP ActiveMQ教程 欢迎使用Spring AMQP ActiveMQ教程.之前我们研究过安装Apache ActiveMQ服务器.今天我们将创建一个Spring应用程序来使用 ...

最新文章

  1. 水声定位中的CBF波束形成原理
  2. ajax 405报错,使用ajax请求时发生随机HTTP错误405
  3. 计算机网络的自我介绍和评价,计算机网络自我介绍范文
  4. javaSE----for,wile ,do while循环的应用
  5. 转:Android应用Icon大小在不同分辨率下定义
  6. 基于HMM和维特比算法的中文分词
  7. VMProtect Ultimate 加壳脱壳工
  8. AndroidStudio 编译报错 abc_list_selector_disabled_holo_light.9.png
  9. sqrt函数用法c语言 linux,C语言中sqrt函数如何使用
  10. 获取上个月第一天和最后一天
  11. ckplayer只调用html,Ckplayer的安装及调用
  12. 全球及中国26二氟苯磺酰氯行业发展状况与前景趋势分析报告2022-2028年
  13. 中望3D 2021 自动缩放基准面大小
  14. Python的图像处理库(OpenCV,PIL,matplotlib和scikit-image)
  15. 《HelloGitHub》第 60 期,你喜欢玩游戏吗?
  16. 三维渲染 光能辐射基础
  17. 畅写Office云端SDK :“硬核”赋予企业应用在线文档I在线协作编辑I在线预览I在线格式转换服务
  18. sprintf 用法(sprintf_s)
  19. android系统开发 AP 和 BP 简要说明
  20. 潇洒郎: 解决联想电脑Y430p 一碰触摸板就蓝屏

热门文章

  1. 0007 将英尺转换为米制单位
  2. 互联网日报 | 7月21日 星期四 | 脉脉CEO再回应点评招聘评论真实性;​微信版本再更新;上半年前十位SUV品牌销量排名出炉...
  3. 计算半圆弧长及半圆的面积。(3分)
  4. 【网络】什么是HTTPS证书?
  5. peewee和peewee_async常用汇总(持续更新)
  6. 大龄程序员的出路在哪里?
  7. 微信小程序-电影app程序遇到得问题
  8. 全新文案馆头像壁纸小程序源码+带后台的
  9. 百家号不推荐的文章如何解决呢?
  10. icloud有linux客户端吗,Windows 版 iCloud 客户端如何下载?iCloud Drive 如何在 PC 使用?...