Spring主题订阅者线程池

时间:2011-05-03 13:02:42

标签: java multithreading spring jms publish-subscribe

我几天来一直在浏览论坛和网站,关于如何用很少的运气来拼接Spring JMS订阅者。当使用带有jms:listener-container的队列时,有一个并发属性,但它有一个主题,它规定将并发性保持在1.鉴于此,我有什么选择对主题订阅者进行线程池化?

我开始使用MessageListener路由,并使用onMessage实现:

    <bean id="messageListener" class="com.app.mdp.Receiver"/>
    <jms:listener-container container-type="default"
        connection-factory="connectionFactory" acknowledge="auto" concurrency="1"
        destination-type="topic" prefetch="1">
        <jms:listener destination="topTopic" ref="messageListener"
            method="onMessage" subscription="ASub" />
    </jms:listener-container>

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

这个问题是我最多只能获得一个从JMS接收数据的线程。

然后我尝试使用config:

的任务执行器
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
  <property name="corePoolSize" value="10" />
  <property name="maxPoolSize" value="20" />
  <property name="queueCapacity" value="0" />
</bean> 

..但似乎要求并发在jms:listener-container设置中具有更大的价值(除非我误解)。我一次只收到一个帖子。

我有点茫然,开始认为spring在订阅JMS主题数据时没有支持多线程的功能。如果是这种情况,我的选择似乎是:

  • 实现我自己的线程池。 schedule subscriber-&gt;循环遍历jmsTmplate.receive()data-&gt;将每条消息传递给预定义的线程
  • 恢复到EJB(我不想这样做)
  • 我尚未想到的其他事情

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您是否正在使用Websphere进行JMS。如果是,那么Websphere中有一个配置,您可以在其中配置一次可以为应用程序建立的连接数和会话数。 假设您有10个会话和10个连接,那么您将有100个连接(通道)向MQ服务器打开。参考此链接: http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/umj_sesspoolset.html