jms发送消息
来源:互联网 发布:钢笔字帖谁的好 知乎 编辑:程序博客网 时间:2024/06/04 17:41
<property name="delegate">
<bean class="com.mms.job.mq.listener.ProxyDefaultMQListenerImpl"/>
</property>
<property name="defaultListenerMethod" value="handleMessage"/>
<property name="messageConverter" ref="jmsMessageConverter"/>
</bean>
项目中用到了这个
@Component("proxyDefaultMQListener")
public class ProxyDefaultMQListenerImpl implements InitializingBean, IMQListener {
@Override
public void afterPropertiesSet() throws Exception {}
public void handleMessage(IMessage mqMessage) throws Exception {}
}
public interface IMQListener {
void handleMessage(IMessage mqMessage)throws Exception;
}
最后查资料解释如下
MessageListenerAdapter
MessageListenerAdapter类实现了MessageListener接口和SessionAwareMessageListener接口,它的主要作用是将接收到的消息进行类型转换,然后通过反射的形式把它交给一个普通的Java类进行处理。
MessageListenerAdapter会把接收到的消息做如下转换:
TextMessage转换为String对象;
BytesMessage转换为byte数组;
MapMessage转换为Map对象;
ObjectMessage转换为对应的Serializable对象。
既然前面说了MessageListenerAdapter会把接收到的消息做一个类型转换,然后利用反射把它交给真正的目标处理器——一个普通的Java类进行处理(如果真正的目标处理器是一个MessageListener或者是一个SessionAwareMessageListener,那么Spring将直接使用接收到的Message对象作为参数调用它们的onMessage方法,而不会再利用反射去进行调用),那么我们在定义一个MessageListenerAdapter的时候就需要为它指定这样一个目标类。这个目标类我们可以通过MessageListenerAdapter的构造方法参数指定,如:
- <!-- 消息监听适配器 -->
- <bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
- <constructor-arg>
- <bean class="com.tiantian.springintejms.listener.ConsumerListener"/>
- </constructor-arg>
- </bean>
也可以通过它的delegate属性来指定,如:
- <!-- 消息监听适配器 -->
- <bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
- <property name="delegate">
- <bean class="com.tiantian.springintejms.listener.ConsumerListener"/>
- </property>
- <property name="defaultListenerMethod" value="receiveMessage"/>
- </bean>
前面说了如果我们指定的这个目标处理器是一个MessageListener或者是一个SessionAwareMessageListener的时候Spring将直接利用接收到的Message对象作为方法参数调用它们的onMessage方法。但是如果指定的目标处理器是一个普通的Java类时Spring将利用Message进行了类型转换之后的对象作为参数通过反射去调用真正的目标处理器的处理方法,那么Spring是如何知道该调用哪个方法呢?这是通过MessageListenerAdapter的defaultListenerMethod属性来决定的,当我们没有指定该属性时,Spring会默认调用目标处理器的handleMessage方法。
接下来我们来看一个示例,假设我们有一个普通的Java类ConsumerListener,其对应有两个方法,handleMessage和receiveMessage,其代码如下:
- package com.tiantian.springintejms.listener;
- public class ConsumerListener {
- public void handleMessage(String message) {
- System.out.println("ConsumerListener通过handleMessage接收到一个纯文本消息,消息内容是:" + message);
- }
- public void receiveMessage(String message) {
- System.out.println("ConsumerListener通过receiveMessage接收到一个纯文本消息,消息内容是:" + message);
- }
- }
假设我们要把它作为一个消息监听器来监听发送到adapterQueue的消息,这个时候我们就可以定义一个对应的MessageListenerAdapter来把它当做一个MessageListener使用。
- <!-- 消息监听适配器 -->
- <bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
- <property name="delegate">
- <bean class="com.tiantian.springintejms.listener.ConsumerListener"/>
- </property>
- <property name="defaultListenerMethod" value="receiveMessage"/>
- </bean>
当然,有了MessageListener之后我们还需要配置其对应的MessageListenerContainer,这里配置如下:
- <!-- 消息监听适配器对应的监听容器 -->
- <bean id="messageListenerAdapterContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- <property name="connectionFactory" ref="connectionFactory"/>
- <property name="destination" ref="adapterQueue"/>
- <property name="messageListener" ref="messageListenerAdapter"/><!-- 使用MessageListenerAdapter来作为消息监听器 -->
- </bean>
在上面的MessageListenerAdapter中我们指定了其defaultListenerMethod属性的值为receiveMessage,所以当MessageListenerAdapter接收到消息之后会自动的调用我们指定的ConsumerListener的receiveMessage方法。
针对于上述代码我们定义测试代码如下:
- package com.tiantian.springintejms.test;
- import javax.jms.Destination;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.test.context.ContextConfiguration;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
- import com.tiantian.springintejms.service.ProducerService;
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration("/applicationContext.xml")
- public class ProducerConsumerTest {
- @Autowired
- @Qualifier("adapterQueue")
- private Destination adapterQueue;
- @Test
- public void testMessageListenerAdapter() {
- producerService.sendMessage(adapterQueue, "测试MessageListenerAdapter");
- }
- }
这时候我们会看到控制台输出如下:
如果我们不指定MessageListenerAdapter的defaultListenerMethod属性,那么在运行上述代码时控制台会输出如下结果:
MessageListenerAdapter除了会自动的把一个普通Java类当做MessageListener来处理接收到的消息之外,其另外一个主要的功能是可以自动的发送返回消息。
- JMS 发送消息
- jms消息发送机制
- jms发送消息
- jms 发送邮件消息
- JMS 向 actioveMQ 发送消息
- 使用JMS发送消息--ActiveMQ
- Spring + ActiveMQ实现jms发送消息
- python实现jms客户端(发送接收消息)
- Spring + ActiveMQ实现jms发送消息
- spring interation学习-01发送jms消息
- Spring之JMS之发送消息
- Spring之JMS之发送消息
- ActiveMQ-JMS(二):发送消息
- Spring + ActiveMQ兑现jms发送消息
- Spring + ActiveMQ兑现jms发送消息
- JMS发送消息工具类MsgQueueSender
- 消息应答机制重复发送JMS(八)
- Sping JMS使用消息转换器发送或接收消息
- XML 数据解析方式
- const
- windows杀掉占用端口进程
- Android开发MVP模式个人见解
- http://base64.supfree.net/---网站base64加密竟然是错误的
- jms发送消息
- 5-14 求整数段和 (15分)
- 手机上的消息推送
- Wildcard Matching
- Spring同Mybatis的整合
- Three.JS(1)直线
- Android使用Lambda之中文乱码
- js解析xml文件,实现省市区三级联动
- 七月五日学习笔记之监听器&国际化