我有以下留言消费者
@Service
public class BlockServiceConsumer {
public void blockService(PhoneServiceVO phoneServiceVO) throws Exception {
// message processing
}
并使用jms:listener-container
connectionFactory
和queue
定义
<context:component-scan base-package="com.stealthgenie.scheduler" />
<context:annotation-config/>
<bean id="blockServiceQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="BLOCK_SERVICE.QUEUE"/>
</bean>
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL">
<value>tcp://localhost:61616</value>
</property>
</bean>
<jms:listener-container acknowledge="auto" connection-factory="connectionFactory" destination-type="queue" concurrency="10-20">
<jms:listener destination="BLOCK_SERVICE.QUEUE" ref="blockServiceConsumer" method="blockService" />
</jms:listener-container>
我的问题:为什么此设置在没有实施MessageListener
的情况下正常工作,尽管文档提到它是必需的。注意我还没有使用MessageListenerAdapter
以类似于EJB世界中的消息驱动Bean(MDB)的方式,消息驱动的POJO(MDP)充当JMS消息的接收器。 MDP上的一个限制(但也参见下面对MessageListenerAdapter类的讨论)是它必须实现javax.jms.MessageListener接口。另请注意,如果您的POJO将在多个线程上接收消息,请务必确保您的实现是线程安全的。
答案 0 :(得分:2)
当您将侦听器容器连接为<bean/>
或以编程方式连接时,该文档是指
使用<jms:listener-container/>
命名空间时,解析器连接MessageListenerAdapter
,它将从onMessage
方法调用您的POJO。
这在参考文件Section about JMS Namespace Support中讨论。