如何使用SpringJMS在ActiveMQ中创建多个侦听器

如何使用SpringJMS在ActiveMQ中创建多个侦听器,spring,activemq,spring-integration,spring-jms,Spring,Activemq,Spring Integration,Spring Jms,我有一个用例,希望在应用程序中创建多个侦听器(6)。我想订阅多个目的地(6个主题)所有订阅都是持久的。我为每个侦听器使用单独的默认消息侦听器容器(DMLC),并使用不同的客户机id,但我对如何使用连接工厂感到困惑 我是否应该使用单个ActiveMQ池连接工厂,并将maxConnection指定为6。或者我应该为每个侦听器使用不同的池连接工厂吗? 将pooledConnectionFactory与maxConnection一起用于持久订户是否有任何危害 源代码: 连接工厂: <bean id

我有一个用例,希望在应用程序中创建多个侦听器(6)。我想订阅多个目的地(6个主题)所有订阅都是持久的。我为每个侦听器使用单独的默认消息侦听器容器(DMLC),并使用不同的客户机id,但我对如何使用连接工厂感到困惑

我是否应该使用单个ActiveMQ池连接工厂,并将maxConnection指定为6。或者我应该为每个侦听器使用不同的池连接工厂吗?
将pooledConnectionFactory与maxConnection一起用于持久订户是否有任何危害

源代码:
连接工厂:

<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL">
<value>${jms.broker.url}</value>
</property>
</bean>
</property>
<property name="maxConnections" value="6" />

${jms.broker.url}
我的监听器将其用作:(我有6个类似的监听器,它们使用不同的目的地和客户端ID,与此类似)


只要您没有将此连接工厂用于其他用途,我觉得这一切都很好。没有理由将连接数限制为6,如果需要,可以输入更高的连接数,并且仅在必要时使用<代码>连接工厂
通常是您为整个应用程序共享的东西。将其视为JMS访问的一种
数据源

,因为您使用的是主题,所以您的侦听器通常每个只使用一个会话。没有理由指定池的限制或使用多个池。您通常会对应用程序使用一个池连接工厂,除非您看到了将其限制或拆分为不同池的真正原因。

正如您所说的“您没有将此连接工厂用于其他用途”。。如果我在JMStemplate中使用它来创建生产者,在DMLC中使用它来创建消费者(如上所示)。如果我对JMStemplate和DMLC使用相同的连接工厂,会不会导致问题?正如您在尝试使用少于6个连接时所说的“没有理由将连接数限制为6”,它给了我下面的错误,因为它是一个持久订户,每个订户对于一个连接应该有不同的客户端id**org.springframework.jms.listener.DefaultMessageListenerContainer#refreshConnectionUntilSuccessful 875 WARN]-无法刷新目标服务器的jms连接topic://.seedTCAStatusPush“-5000毫秒后重试。原因:不允许在已使用的连接上设置clientID**我必须对连接设置此限制。如果使用的连接少于6个,则会出现此错误,因为持久订户“**org.springframework.jms.listener.DefaultMessageListenerContainer#refreshConnect‌​IonUntillSuccessful 875 WARN]-无法刷新目标服务器的JMS连接topic://.seedTCAStatusPush“-5000毫秒后重试。原因:不允许在已使用的连接上设置clientID**”您能回答吗?我并没有说您应该使用少于6个。我只是说没有理由限制你的听众。谢谢彼特。所以,即使我通过将maxConnection指定为所需的值来为生产者(使用JMStemplate)和消费者(使用DMLC)使用相同的连接工厂。应该没问题吧?没有。最大的价值是确保你的应用程序不会发疯,并用连接淹没JMS服务器。
<bean id="listenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer"

      <property name="connectionFactory" ref="jmsFactory" />
      <property name="destination" ref="topic_pnlCompleteTopic" />
      <property name="durableSubscriptionName" value="FAGCompletion" />
      <property name="pubSubDomain" value="true" />
      <property name="subscriptionDurable" value="${jms.fagsListener.durable}" />
      <property name="clientId" value="${jms.fagsListener.clientId}" />
      <property name="messageListener" ref="pnlMessageListener" />
      <property name="messageSelector" value="JMSType = 'FAG Completion'" />
 </bean>