我的应用程序是基于Spring的应用程序。我正在使用activemq作为经纪人。我在我的应用程序中管理两个不同的队列接收消息。
对于每个队列,我的应用程序的目标是监听代理上发送的消息,然后继续消息(读取它,从发送到此消息的信息执行数据库操作等),然后处理下一条消息(所以治疗是同步的,我想按照他们到达的顺序进行消息。
我的实际设计就是这个:
我创建一个帖子
<bean id="pollThread" class="my.app.receiver" init-method="start" destroy-method="interrupt">
</bean>
线程调用的run()方法在while(true)循环中执行一个方法:
然后重新开始治疗(收听,治疗等)
我的问题是:有什么方法可以更好地设计它吗?我唯一的强制性流程是按照到达顺序继续发送消息,并在处理下一条消息之前进行处理。
我已经阅读了很多关于JMSTemplate的内容,但是我丢失了所有的信息。
实际上我最好的猜测是创建一个PooledConnectionFactory(因为我们只使用ActiveMQ,CachingConnectionFactory似乎在我们的架构中具有重要的限制)并将其限制为一个并发消费者。然后使用MessageListener接口继续我的消息。
由于
答案 0 :(得分:-1)
您可以使用Spring框架提供的Message Driven POJO基础结构。它将在目的地进行轮询,并在经纪人失败等情况下恢复。
您可以更改代码(例如YourMessageListener
)以实施MessageListener
。然后,以下配置可以帮助您入门
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="messageListener" class="org.foo.YourMessageListener"/>
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://your-server:61616"/>
</bean>
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="queue/yourQueue"/>
</bean>
<bean id="jmsContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="destination"/>
<property name="concurrency" value="1"/>
<property name="messageListener" ref="messageListener"/>
</bean>
</beans>
重要的设置是concurrency
元素,它限制了可以同时处理该目标上的消息的线程数。通过将其设置为1,一次只有一个线程使用消息。
有关详细信息,请参阅documentation