有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何线程池SpringJMS侦听器

我正在设置一个JMS订户侦听器,其目标是实现一个由5个线程组成的池来侦听topATopic,然而,我在运行时看到的是多个使用者处理同一条记录(使用者的recordCount*#)

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

<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>

有人能为我指明实现目标的方向吗


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

    concurrency: The number of concurrent sessions/consumers to start for each listener. Can either be a simple number indicating the maximum number (e.g. "5") or a range indicating the lower as well as the upper limit (e.g. "3-5"). Note that a specified minimum is just a hint and might be ignored at runtime. Default is 1; keep concurrency limited to 1 in case of a topic listener or if queue ordering is important; consider raising it for general queues.

    This post与您的问题的其余部分类似

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