SpringSide2论坛中的一则贴子讨论了ActiveMQ在设置多个异步服务时方法(activeMQ的疑问?),最近的项目中也遇到了类似的需求,需要多项异步服务,按照帖子中的设置进行了多次实践均不能成功,始终只有一个listener在后台监听。由于项目时间进度要求比较紧,没有再进行深入研究,利用代理的设计方法暂时解决了多个异步服务的需求。
java 代码
- package cn.org.coral.core.jms;
- /**
- * JMS消息接收者接口
- * @author lib
- *
- */
- public interface MQReceiver {
- /**
- * 消息对象处理方法
- * @param object
- */
- void dispose(java.io.Serializable object);
- }
java 代码
- package cn.org.coral.core.jms;
- import java.io.Serializable;
- /**
- * 消息对象的处理适配器接口
- * @author Lib
- *
- */
- public interface MQAdapter extends Serializable {
- /**
- * 得到服务的名称,将根据服务名称得到服务
- * 对象的实例,对消息对象进行处理
- * @return
- */
- public String obtainServiceName();
- }
java 代码
- package cn.org.coral.core.jms.imp;
- import java.io.Serializable;
- import org.apache.commons.lang.StringUtils;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import cn.org.coral.core.jms.MQAdapter;
- import cn.org.coral.core.jms.MQReceiver;
- import cn.org.coral.core.utils.ServiceLocator;
- /**
- * JMS消息接收者公共代理,将不同的消息对象送给对应的服务进行处理
- * @author lib
- *
- */
- public class MQReceiverProxyImpl implements MQReceiver {
- Log logger = LogFactory.getLog(this.getClass());
- /* (non-Javadoc)
- * @see cn.org.coral.core.jms.MQReceiver#dispose(java.io.Serializable)
- */
- public void dispose(Serializable object) {
- if(object instanceof MQAdapter) {
- MQAdapter adapter = (MQAdapter)object;
- String serviceName = adapter.obtainServiceName();
- if(StringUtils.isNotBlank(serviceName)){
- MQReceiver receiver = (MQReceiver) ServiceLocator.getBean(serviceName);
- receiver.dispose(object);
- }else{
- logger.error(" Object:["+object+"]'s receiver is empty!");
- }
- }else{
- logger.error(" Object:"+object+" not find receiver!");
- }
- }
- }
xml 代码
- <bean id="messageConverter" class="cn.org.coral.core.jms.MQConverter"/>
- <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
- <property name="connectionFactory">
- <bean class="org.springframework.jms.connection.SingleConnectionFactory">
- <property name="targetConnectionFactory" ref="jmsConnectionFactory"/>
- bean>
- property>
- <property name="messageConverter" ref="messageConverter"/>
- bean>
- <amq:queue name="destination" physicalName="org.apache.activemq.spring.Test.spring.embedded"/>
- <bean id="messageListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
- <constructor-arg>
- <bean class="cn.org.coral.core.jms.imp.MQReceiverProxyImpl"/>
- constructor-arg>
- <property name="defaultListenerMethod" value="dispose"/>
- <property name="messageConverter" ref="messageConverter"/>
- bean>
- <bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- <property name="connectionFactory" ref="jmsConnectionFactory"/>
- <property name="destination" ref="destination"/>
- <property name="messageListener" ref="messageListener"/>
- bean>