5

我正在按如下方式设置一个 JMS 订阅者侦听器,目的是实现一个由 5 个线程组成的池来侦听 topATopic,但是,我在运行时看到的是多个消费者处理同一条记录(recordCount*#of 消费者)。

考虑到我是春天的新手,我假设我做错了什么。

<bean id="messageListener" class="com.abc.app.mdp.Receiver">
<property name="bean" ref="bean" />
</bean>

<jms:listener-container container-type="default"
connection-factory="connectionFactory" acknowledge="auto" concurrency="5" destination-type="topic" prefetch="1" cache="none" >
<jms:listener destination="topCli_Service" ref="messageListener" 
method="onMessage" subscription="AProjectSubscriber" />
</jms:listener-container>

<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryB ean">
<property name="jndiName" value="jms/jms-top-notx" />
</bean>

有人可以指出我实现目标的方向吗?

4

2 回答 2

12

查看侦听器容器配置上的并发设置。Spring JMS 文档建议主题侦听器的并发性应设置为 1。见下文。

并发:为每个侦听器启动的并发会话/消费者的数量。可以是表示最大数的简单数字(例如“5”),也可以是表示下限和上限的范围(例如“3-5”)。请注意,指定的最小值只是一个提示,在运行时可能会被忽略。默认为 1;在主题侦听器或队列排序很重要的情况下,将并发限制为 1 ;考虑为一般队列提高它。

这篇文章与您的其他问题类似。

如果您需要多个线程来跟上消息量,您的消息侦听器可以委托给 Spring TaskExecutor来异步处理消息。TaskExecutors 可以由包括线程池在内的许多实现支持。

于 2011-04-27T18:32:39.840 回答
2

如果您希望给定消息由一个且只有一个消费者使用,您应该使用队列而不是主题。将主题消息广播给所有可用的消费者。

于 2011-04-27T16:49:29.630 回答