ActiveMQ5.0实战三:使用Spring发送,消费topic和queue消息
来源:互联网 发布:平板软件 编辑:程序博客网 时间:2024/06/11 09:52
简介
实战一 , 实战二介绍了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:connectionFactoryid="jmsConnectionFactory"brokerURL="vm://localhost"/>
brokerURL是指要连接的activeMQ server的地址, activeMQ提供了多种brokerURL, 集体可参见文档.一般我们使用嵌套的ActiveMQ server. 配置如下, 这个配置使用消息的存储机制, 服务器重启也不会丢失消息.
- <!-- embedded ActiveMQ Broker -->
- <amq:brokeruseJmx="false"persistent="true">
- <amq:persistenceAdapter>
- <amq:amqPersistenceAdapterdirectory="d:/amq"/>
- </amq:persistenceAdapter>
- <amq:transportConnectors>
- <amq:transportConnectoruri="tcp://localhost:61616"/>
- <amq:transportConnectoruri="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"/>
3. JmsTemplate
- <!-- Spring JmsTemplate config -->
- <beanid="jmsTemplate"class="org.springframework.jms.core.JmsTemplate">
- <propertyname="connectionFactory">
- <!-- lets wrap in a pool to avoid creating a connection per send -->
- <beanclass="org.springframework.jms.connection.SingleConnectionFactory">
- <propertyname="targetConnectionFactory"ref="jmsConnectionFactory"/>
- </bean>
- </property>
- <!-- custom MessageConverter -->
- <propertyname="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 -->
- <beanid="topicMessageProducer"class="com.andyao.activemq.TopicMessageProducer">
- <propertyname="template"ref="jmsTemplate"/>
- <propertyname="destination"ref="TOPIC"/>
- </bean>
- <beanid="queueMessageProducer"class="com.andyao.activemq.QueuMessageProducer">
- <propertyname="template"ref="jmsTemplate"/>
- <propertyname="destination"ref="QUEUE"/>
- </bean>
6. MessageConsumer
TOPIC通道有两个消息消费者, QUEUE有一个消息消费者
- <!-- Message Driven POJO (MDP) -->
- <!-- consumer1 for topic a -->
- <beanid="topicConsumerA"class="com.andyao.activemq.TopicConsumerA"/>
- <!-- consumer2 for topic a -->
- <beanid="topicConsumerB"class="com.andyao.activemq.TopicConsumerB"/>
- <!-- consumer for queue -->
- <beanid="queueConsumer"class="com.andyao.activemq.QueueConsumer"/>
7. MessageListener
每一个消息消费者都对应一个MessageListener
- <bean id="topicListenerA"class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
- <constructor-argref="topicConsumerA"/>
- <!-- may be other method -->
- <propertyname="defaultListenerMethod"value="receive"/>
- <!-- custom MessageConverter define -->
- <propertyname="messageConverter"ref="defaultMessageConverter"/>
- </bean>
- <beanid="topicListenerB"class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
- <constructor-argref="topicConsumerB"/>
- <!-- may be other method -->
- <propertyname="defaultListenerMethod"value="receive"/>
- <!-- custom MessageConverter define -->
- <propertyname="messageConverter"ref="defaultMessageConverter"/>
- </bean>
- <beanid="queueListener"class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
- <constructor-argref="queueConsumer"/>
- <!-- may be other method -->
- <propertyname="defaultListenerMethod"value="receive"/>
- <!-- custom MessageConverter define -->
- <propertyname="messageConverter"ref="defaultMessageConverter"/>
- </bean>
8. MessageListenerContainer
有几个MessageListener既有几个MessageListenerContainer
- <bean id="topicListenerContainerA"class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- <propertyname="connectionFactory"ref="jmsConnectionFactory"/>
- <propertyname="destination"ref="TOPIC"/>
- <propertyname="messageListener"ref="topicListenerA"/>
- </bean>
- <beanid="topicListenerContainerB"class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- <propertyname="connectionFactory"ref="jmsConnectionFactory"/>
- <propertyname="destination"ref="TOPIC"/>
- <propertyname="messageListener"ref="topicListenerB"/>
- </bean>
- <beanid="queueListenerContainer"class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- <propertyname="connectionFactory"ref="jmsConnectionFactory"/>
- <propertyname="destination"ref="QUEUE"/>
- <propertyname="messageListener"ref="queueListener"/>
- </bean>
Summary
写spring配置文件的时候, 要把MessageProducer, MessageConsumer,MessageListener,MessageListenerContainer几个地方弄清楚:
- 可以有一个或者多个消息生产者向同一个destination发送消息.
- queue类型的只能有一个消息消费者.
- topic类型的可以有多个消息消费者.
- 每个消费者对应一个MessageListener和一个MessageListenerContainer.
- ActiveMQ5.0实战三:使用Spring发送,消费topic和queue消息
- ActiveMQ5.0实战三:使用Spring发送,消费topic和queue消息
- ActiveMQ5.0实战二:使用Spring发送,消费topic和queue消息
- mq 使用Spring发送,消费topic和queue消息
- MQ系列3 使用Spring发送,消费topic和queue消息 activeMQ
- ActiveMQ (二) 使用Queue或者Topic发送/接受消息
- ActiveMQ 使用Queue或者Topic发送/接受消息
- ActiveMQ(三):使用Topic方式发送消息
- 利用Spring与ActiveMQ整合发送、接收消息实例(Queue与Topic模式)
- QX项目实战-8.ActiveMQ的Queue消息和Topic消息
- ActiveMQ5.0.1+Spring实现JMS异步消息发送
- ActiveMQ5.0.1+Spring实现JMS异步消息发送
- JMS(二):MessageListener,实战Queue ,实战Topic,消息头
- spring-jms(activemq实现)使用queue发送消息简单例子
- ActiveMQ5.0实战
- ActiveMQ5.0实战
- 查看当前服务器中的所有的topic,创建topic,删除topic,通过shell命令发送消息,通过shell消费消息,查看topic详情,对分区数进行修改
- JMS Topic 和 JMS Queue 使用场景
- 第24贴:经典接法三极管电路的静态计算
- .net基础问题
- c类型转换char2short
- 一条进程的栈区、堆区、数据区和代码区在内存中的映射
- 再论JAVA中的核心数据——Map&Set
- ActiveMQ5.0实战三:使用Spring发送,消费topic和queue消息
- vs快捷键
- java时间戳
- 解决Java中URL传递中文参数时出现乱码的问题
- 让人神经的爱情
- IOS5下的bug
- 巴西海关关于NPJ and CPF的规定
- 转载 使用Eclipse的Working Set,界面清爽多了
- 给定单链表(head),如果有环的话请返回从头结点进入环的第一个节点