- 浏览: 146918 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
陈碧滔:
java获取工程目录路径 -
stevenjohn:
楼主能上传一下源代码吗?
ActiveMQ5.0实战三:使用Spring发送,消费topic和queue消息 -
指挥家:
讲的很好!
Foxmail6收发Web mail邮箱邮件实现原理 -
azhqiang:
谢谢你啊。呵呵
flex最全的表单验证
简介
实战一 , 实战二介绍了ActiveMQ的基本概念和配置方式.
本篇将通过一个实例介绍使用spring发送,消费topic, queue类型消息的方法. 不懂topic和queue的google 之.
如图示, TOPIC和QUEUE分别代表一个topic和一个queue消息通道.
- TopicMessageProducer向topic发送消息, TopicConsumerA和TopicConsumerB则从topic消费消息.
- QueueMessageProducer向Queue发送消息, QueueConsumer从Queue中消费消息
Spring整合JMS
就像对orm, web的支持一样, spring同样支持jms, 为整合jms到已有的项目提供了很多便利的方法. 本篇主要讲实战, 是所以先从配置开始, spring配置jms基本上需要8个部分.
- ConnectionFactory. 和jms服务器的连接, 可以是外部的jms server, 也可以使用embedded ActiveMQ Broker.
- Destination. 有topic和queue两种方式.
- JmsTemplate. spring提供的jms模板.
- MessageConverter. 消息转换器.
- MessageProducer. 消息生产者.
- MessageConsumer. 消息消费者.
- MessageListener. 消息监听器
- MessageListenerContainer. 消息监听容器
下面以实例的方式介绍上面8个部分.
1. ConnectionFactory
<amq:connectionFactory id="jmsConnectionFactory" brokerURL="vm://localhost" />
brokerURL是指要连接的activeMQ server的地址, activeMQ提供了多种brokerURL, 集体可参见文档.一般我们使用嵌套的ActiveMQ server. 配置如下, 这个配置使用消息的存储机制, 服务器重启也不会丢失消息.
- <!-- embedded ActiveMQ Broker -->
- <amq:broker useJmx="false" persistent="true">
- <amq:persistenceAdapter>
- <amq:amqPersistenceAdapter directory="d:/amq"/>
- </amq:persistenceAdapter>
- <amq:transportConnectors>
- <amq:transportConnector uri="tcp://localhost:61616" />
- <amq:transportConnector uri="vm://localhost:0" />
- </amq:transportConnectors>
- </amq:broker>
<!-- embedded ActiveMQ Broker --> <amq:broker useJmx="false" persistent="true"> <amq:persistenceAdapter> <amq:amqPersistenceAdapter directory="d:/amq"/> </amq:persistenceAdapter> <amq:transportConnectors> <amq:transportConnector uri="tcp://localhost:61616" /> <amq:transportConnector uri="vm://localhost:0" /> </amq:transportConnectors> </amq:broker>
2. Destination
在实例中我们使用了两种destination
- <!-- ActiveMQ destinations -->
- <!-- 使用topic方式-->
- <amq:topic name="TOPIC" physicalName="JMS-TEST-TOPIC" />
- <!-- 使用Queue方式-->
- <amq:queue name="QUEUE" physicalName="JMS-TEST-QUEUE" />
<!-- ActiveMQ destinations --> <!-- 使用topic方式--> <amq:topic name="TOPIC" physicalName="JMS-TEST-TOPIC" /> <!-- 使用Queue方式--> <amq:queue name="QUEUE" physicalName="JMS-TEST-QUEUE" />
3. JmsTemplate
- <!-- Spring JmsTemplate config -->
- <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
- <property name="connectionFactory">
- <!-- lets wrap in a pool to avoid creating a connection per send -->
- <bean class="org.springframework.jms.connection.SingleConnectionFactory">
- <property name="targetConnectionFactory" ref="jmsConnectionFactory" />
- </bean>
- </property>
- <!-- custom MessageConverter -->
- <property name="messageConverter" ref="defaultMessageConverter" />
- </bean>
<!-- Spring JmsTemplate config --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory"> <!-- lets wrap in a pool to avoid creating a connection per send --> <bean class="org.springframework.jms.connection.SingleConnectionFactory"> <property name="targetConnectionFactory" ref="jmsConnectionFactory" /> </bean> </property> <!-- custom MessageConverter --> <property name="messageConverter" ref="defaultMessageConverter" /> </bean>
4. MessageConverter
MessageConverter实现的是org.springframework.jms.support.converter.MessageConverter接口, 提供消息的转换功能. DefaultMessageConverter的实现见附件.
<bean id="defaultMessageConverter" class="com.andyao.activemq.DefaultMessageConverter" />
5. MessageProducer
实例拥有两个消息生产者, 消息生产者都是POJO, 实现见附件.
- <!-- POJO which send Message uses Spring JmsTemplate -->
- <bean id="topicMessageProducer" class="com.andyao.activemq.TopicMessageProducer">
- <property name="template" ref="jmsTemplate" />
- <property name="destination" ref="TOPIC" />
- </bean>
- <bean id="queueMessageProducer" class="com.andyao.activemq.QueuMessageProducer">
- <property name="template" ref="jmsTemplate" />
- <property name="destination" ref="QUEUE" />
- </bean>
<!-- POJO which send Message uses Spring JmsTemplate --> <bean id="topicMessageProducer" class="com.andyao.activemq.TopicMessageProducer"> <property name="template" ref="jmsTemplate" /> <property name="destination" ref="TOPIC" /> </bean> <bean id="queueMessageProducer" class="com.andyao.activemq.QueuMessageProducer"> <property name="template" ref="jmsTemplate" /> <property name="destination" ref="QUEUE" /> </bean>
6. MessageConsumer
TOPIC通道有两个消息消费者, QUEUE有一个消息消费者
- <!-- Message Driven POJO (MDP) -->
- <!-- consumer1 for topic a -->
- <bean id="topicConsumerA" class="com.andyao.activemq.TopicConsumerA" />
- <!-- consumer2 for topic a -->
- <bean id="topicConsumerB" class="com.andyao.activemq.TopicConsumerB" />
- <!-- consumer for queue -->
- <bean id="queueConsumer" class="com.andyao.activemq.QueueConsumer" />
<!-- Message Driven POJO (MDP) --> <!-- consumer1 for topic a --> <bean id="topicConsumerA" class="com.andyao.activemq.TopicConsumerA" /> <!-- consumer2 for topic a --> <bean id="topicConsumerB" class="com.andyao.activemq.TopicConsumerB" /> <!-- consumer for queue --> <bean id="queueConsumer" class="com.andyao.activemq.QueueConsumer" />
7. MessageListener
每一个消息消费者都对应一个MessageListener
- <bean id="topicListenerA" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
- <constructor-arg ref="topicConsumerA" />
- <!-- may be other method -->
- <property name="defaultListenerMethod" value="receive" />
- <!-- custom MessageConverter define -->
- <property name="messageConverter" ref="defaultMessageConverter" />
- </bean>
- <bean id="topicListenerB" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
- <constructor-arg ref="topicConsumerB" />
- <!-- may be other method -->
- <property name="defaultListenerMethod" value="receive" />
- <!-- custom MessageConverter define -->
- <property name="messageConverter" ref="defaultMessageConverter" />
- </bean>
- <bean id="queueListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
- <constructor-arg ref="queueConsumer" />
- <!-- may be other method -->
- <property name="defaultListenerMethod" value="receive" />
- <!-- custom MessageConverter define -->
- <property name="messageConverter" ref="defaultMessageConverter" />
- </bean>
<bean id="topicListenerA" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <constructor-arg ref="topicConsumerA" /> <!-- may be other method --> <property name="defaultListenerMethod" value="receive" /> <!-- custom MessageConverter define --> <property name="messageConverter" ref="defaultMessageConverter" /> </bean> <bean id="topicListenerB" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <constructor-arg ref="topicConsumerB" /> <!-- may be other method --> <property name="defaultListenerMethod" value="receive" /> <!-- custom MessageConverter define --> <property name="messageConverter" ref="defaultMessageConverter" /> </bean> <bean id="queueListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <constructor-arg ref="queueConsumer" /> <!-- may be other method --> <property name="defaultListenerMethod" value="receive" /> <!-- custom MessageConverter define --> <property name="messageConverter" ref="defaultMessageConverter" /> </bean>
8. MessageListenerContainer
有几个MessageListener既有几个MessageListenerContainer
- <bean id="topicListenerContainerA" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- <property name="connectionFactory" ref="jmsConnectionFactory" />
- <property name="destination" ref="TOPIC" />
- <property name="messageListener" ref="topicListenerA" />
- </bean>
- <bean id="topicListenerContainerB" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- <property name="connectionFactory" ref="jmsConnectionFactory" />
- <property name="destination" ref="TOPIC" />
- <property name="messageListener" ref="topicListenerB" />
- </bean>
- <bean id="queueListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- <property name="connectionFactory" ref="jmsConnectionFactory" />
- <property name="destination" ref="QUEUE" />
- <property name="messageListener" ref="queueListener" />
- </bean>
<bean id="topicListenerContainerA" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="jmsConnectionFactory" /> <property name="destination" ref="TOPIC" /> <property name="messageListener" ref="topicListenerA" /> </bean> <bean id="topicListenerContainerB" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="jmsConnectionFactory" /> <property name="destination" ref="TOPIC" /> <property name="messageListener" ref="topicListenerB" /> </bean> <bean id="queueListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="jmsConnectionFactory" /> <property name="destination" ref="QUEUE" /> <property name="messageListener" ref="queueListener" /> </bean>
Summary
写spring配置文件的时候, 要把MessageProducer, MessageConsumer,MessageListener,MessageListenerContainer几个地方弄清楚:
- 可以有一个或者多个消息生产者向同一个destination发送消息.
- queue类型的只能有一个消息消费者.
- topic类型的可以有多个消息消费者.
- 每个消费者对应一个MessageListener和一个MessageListenerContainer.
发表评论
-
SSH整合全步骤
2010-08-04 21:53 1005安装所需软件环境: 1、首先安装JDK,配置Java环境 ... -
MyEclipse开发SSH(Struts+Spring+Hibernate)入门 【有图】
2010-08-04 21:52 1372MyEclipse开发SSH(Struts+Spring+Hi ... -
struts2.0.14+hibernate3.2+spring2.5.6+tomcat6.0+mysql5.0整合全过程
2010-08-04 21:51 1391这里为什么使用struts2.0.14这个版本呢??请看官网的 ... -
Struts+Spring+Hibernate精简配制【文件】
2010-08-04 21:49 8451.web.xml <?xml version=&q ... -
hibernate配置文件详解
2010-08-04 21:47 901hibernate.cfg.xml文件详解 ... -
Struts配置文件struts-config.xml
2010-08-04 21:46 767struts-config.xml是Struts的核心文件,该 ... -
java笔试试题(转)
2010-08-02 23:06 814第一,谈谈final, finally ... -
严重: Null component Catalina:type=JspMonitor,name=jsp,..J2EEApplication=none,J2EE
2010-07-27 23:46 15122010-1-7 10:20:53 org.apache.ca ... -
java.util.Date 24小时格式
2010-06-26 13:40 1727在写程序的时候,不小心写了下面的 Jav ... -
java文件操作大全
2010-06-09 23:49 778一.获得控制台用户输入的信息 Java代码 ... -
JAVA复制文件的操作
2010-06-09 23:46 2745Java代码 /** * 复制整个文件夹内 ... -
日期类加减及Java中日期类操作算法大全
2010-06-02 19:31 14181.计算某一月份的最大天数 1Calendar time= ... -
为什么要设置JAVA_HOME、Path、CLASSPATH、CATALINA_HOME
2010-06-02 19:22 1455首先得介绍下面几个参数的作用: current direct ... -
【转】StringUtils
2010-05-06 23:39 1087从代码中我们可以大致了解到这个 StringUtils 类简单 ...
相关推荐
activemq实战
最新的activemq版本,刚开始写jms,希望大家都能用到
该资源是spring与activemq的基础整合,适合消息中间件的初学者
Apache ActiveMQ Queue Topic 详解 教程 加入代码解释说明
一: ActiveMQ简介 包括:是什么、能干什么、特点;...包括:监控和管理Broker、集成ActiveMQ和Tomcat、什么时候使用ActiveMQ等 n 十四: ActiveMQ优化 包括:影响ActiveMQ性能的因素、常见的优化方式和配置等
activemq与spring整合发送jms消息入门实例 jar 包和实例代码都在压缩包里了
结合博客提供spring+activeMQ的demo源码
SpringBoot+ActiveMq+MQTT实现消息的发送和接收 后台消费者、生产者、消息发送接口、发送消息业务类等相关配置
springboot2整合activemq的demo内含queue消息和topic消息,需要使用者修改application.yml的连接地址信息就可以了,端口号是默认的可以不用修改
# Springboot-activeMQ 本项目基于Spring boot这一平台,整合流行的开源消息队列中间件ActiveMQ,实现一个向ActiveMQ添加和读取消息的功能。...3.主题类型topic,创建主题,生产者发送主题消息,以及消费着消费主题消息
ActiveMQ集群实战教程
activemq 虚拟topic配置,可以将一个 topic转发为多个队列和多个topic或者将一个队列转发为多个topic和多个队列
spring-jms使用queue发送消息简单例子,详细参考:http://blog.csdn.net/xiejx618/article/details/38849249
博文链接:https://cddcdd.iteye.com/blog/170685
一个jms activemq Topic 消息实例 关于jms JMS 是接口,相当于jdbc ,要真正使用它需要某些厂商进行实现 ,即jms provider 常见的jms provider 有 ActiveMQ JBoss 社区所研发的 HornetQ (在jboss6 中默认即可以...
整个项目中有activemq和spring的整合的所有实例,topic的持久化配置是在ApplicationContext3C、ApplicationContext3C2以及ApplicationContext3P三个中,消息生产者:QueueProducer 、消息消费者1:SimpleJMSReceiver...
ActiveMQ与spring整合,完成消息的发布和订阅功能
本人在学习activemq,然后 测试完成的demo, 包含了queue,topic,持久化到mysql,订阅模式,包好用
百度spring整合activemq 发现几乎都只是在xml文件配置固定的消息队列而且太麻烦。并没有根据需求进行动态生成主题和队列。本文档参考了纯粹的activemq java代码和百度上的demo,很简洁的实现了动态消息队列的生成和...