activeMQ使用总结
来源:互联网 发布:java三元表达式 编辑:程序博客网 时间:2024/05/17 04:41
这几天在看异步消息,想到了jms,想到了activeMQ。下面是使用记录:
activeMQ可以直接官网上下到。
理解:activeMQ实现了一个队列,提供了tcp、socket等多种连接方式,通过java 的JMS进行发送消息和监听消息。
消息分为两种:queue(队列)、topic(主题),队列是点对点的生产者、消费者模式,主题是发布、订阅模式。
开发与学习过程:
1、网上查找activeMQ和JMS相关资料,大致了解了上面理解的内容。
2、快速的进行开发,集成spring,因为集成spring把监听、队列等jms组件都定义好,更加方便学习。
spring集成jms组件包括:
jmsTemplate:
<!-- 同步和异步消息jmsTemplate -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="receiveTimeout" value="10000" />
</bean>
<bean id="asyJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="asyConnectionFactory" />
<property name="receiveTimeout" value="10000" />
</bean>
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616" />
</bean>
<bean id="asyConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616?jms.useAsyncSend=true" />
</bean>
队列:
<!-- 消息回复队列 -->
<bean id="responseQueue" class="org.apache.activemq.command.ActiveMQQueue"><constructor-arg value="response_queue"/></bean>
监听:
<!-- 回复消息监听器 -->
<bean id="responseQueueListener" class="utry.jms.listener.ResponseQueueListener"/>
<!-- 回复对应的监听容器 -->
<bean id="responseQueueMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="responseQueue"/>
<property name="messageListener" ref="responseQueueListener"/>
</bean>
发送:
public void sendMsg(String destinationName, Serializable obj,
boolean asyncSend) {
if (asyncSend) {
asyJmsTemplate.convertAndSend(destinationName, obj);
} else {
jmsTemplate.convertAndSend(destinationName, obj);
}
}
3、分析监听器类别并选取自己需要的监听器类别:
监听器是执行消息处理的最终要方法,JMS提供了MessageListener接口,实现MessageListener接口并实现OnMessage方法,即可实现消息的监听。
但是,这种方式并没有返回一个处理结束的结果,这是就考虑到了spring提供的SessionAwareMessageListener接口,实现SessionAwareMessageListener接口并实现OnMessage方法,即可实现监听,但是不同的是,OnMessag有两个参数TextMessage message, Session session:通过session可是实现回复该线程 MessageProducer producer = session.createProducer(destination); Message textMessage = session.createTextMessage("ConsumerSessionAwareMessageListener。。。"); producer.send(textMessage);
上面这种方式明显已经可以实现回复信息,但是相对于MessageListenerAdapter还是略显粗暴,MessageListenerAdapter直接实现了以上两个接口,可以直接通过它选择监听方法、操作方法,绑定回复队列。然后DefaultMessageListenerContainer设置messageListener为当前adapter就ok了。
<bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <property name="delegate" ref="consumerMessageListener"/> <property name="defaultListenerMethod" value="receiveMessage"/> <property name="defaultResponseDestination" ref="responseQueue"/></bean><!-- 消息监听适配器对应的监听容器 --><bean id="messageListenerAdapterContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory"/> <property name="destination" ref="queueDestination"/> <property name="messageListener" ref="messageListenerAdapter"/><!-- 使用MessageListenerAdapter来作为消息监听器 --></bean>4、动态添加监听创建队列:
在真正项目使用时,并不会简单意义上的在配置文件中固定几个队列和几个监听。所以要提供接口供开发者进行调用:
注册监听:
public void receiveMsg(String destinationName, IMessageListener listener){
Hashtable<String, Class<IMessageListener>> cache=JmsCache.getCache();
if(cache.containsKey(destinationName)){
System.out.println("监听已经存在");
}else{
cache.put(destinationName, (Class<IMessageListener>) listener.getClass());
System.out.println("注册监听");
//监听容器
DefaultMessageListenerContainer jmsContainer = new DefaultMessageListenerContainer();
//获取adapter
JmsMessageListenerAdapter messageListener=new JmsMessageListenerAdapter(listener);
MessageListenerAdapter messageListenerAdapter=messageListener.getMessageListenerAdapter();
//设置监听容器
jmsContainer.setMessageListener(messageListenerAdapter);
jmsContainer.setConnectionFactory(connectionFactory);
jmsContainer.setDestinationName(destinationName);
jmsContainer.setSessionTransacted(false);
jmsContainer.initialize();
jmsContainer.start();
}
}
adapter实现类
//MessageListenerAdapter
private MessageListenerAdapter messageListenerAdapter=new MessageListenerAdapter();
//监听器
private IMessageListener delegate;
//实现方法
private final String methodName="executeMessage";
//监听回复地址:responseQueue
private final String defaultdestination="response_queue";
/**
* 默认无参构造
*/
public JmsMessageListenerAdapter(){}
/**
* 构造方法
* @param delegate
* 备注:responseQueue是为默认监听
*/
public JmsMessageListenerAdapter(IMessageListener delegate){
this.delegate=delegate;
}
/**
* 获取MessageListenerAdapter
* @return
*/
public MessageListenerAdapter getMessageListenerAdapter(){
messageListenerAdapter.setDelegate(delegate);
messageListenerAdapter.setDefaultListenerMethod(methodName);
messageListenerAdapter.setDefaultResponseQueueName(defaultdestination);
return messageListenerAdapter;
}
发送消息:
public void sendMsg(String destinationName, Serializable obj,
boolean asyncSend) {
if (asyncSend) {
asyJmsTemplate.convertAndSend(destinationName, obj);
} else {
jmsTemplate.convertAndSend(destinationName, obj);
}
}
- ActiveMQ 使用总结
- ActiveMQ使用总结
- ActiveMQ使用总结
- ActiveMQ使用总结
- activeMQ使用总结
- ActiveMQ使用常见问题总结
- ActiveMQ使用总结
- ActiveMQ使用总结
- ActiveMQ学习总结(7)——ActiveMQ使用场景
- activeMQ总结
- activemq 总结
- ActiveMQ总结
- ActiveMQ 总结
- 【ActiveMQ】ActiveMQ的使用
- ActiveMQ使用
- ActiveMQ 使用
- ActiveMQ使用
- activemq 使用?
- Android 相对布局
- NT_iOS笔记—去除string首尾空格、换行
- .Net使用非托管程序
- Vijava 学习笔记之VirtualMachine(CPU Process 更改)
- Linux 网络编程——IP 数据报格式详解
- activeMQ使用总结
- PyQt5学习笔记12----主窗口动态加载Widget
- 最近发现技术博客很有用
- Android_canvas.drawTextOnPath()无效
- 到九月份的任务
- MySQL命令大全
- Oracle忘记登陆用户密码解决办法
- android APK应用安装过程以及默认安装路径
- android多种方式通过URI调用本地百度地图