【问题标题】:Using ActiveMQ/JMS on Tomcat server?在 Tomcat 服务器上使用 ActiveMQ/JMS?
【发布时间】:2022-12-13 12:14:58
【问题描述】:

我们确实在 tomcat 中部署了一个基于 spring 的 Web 应用程序。 Web 应用程序使用 Spring JMSTemplate 和 DefaultMessageListenerContainer 分别生成和使用消息。我们的 JMS 提供程序是 ActiveMQ Classic,我们使用 ActiveMQ 客户端库与本地代理建立连接。我们使用了 activemq-pool 库中的 PooledConnectionFactory。由于它是一个 spring web 应用程序,我们已经定义了连接工厂 bean 并将 connectionFactory 分别连接到 JMSTemplate 和 DefaultMessageListenerContainer beans。我们假设池将由 spring 通过连接工厂驱动。

我们看到的行为是 jms 会话不断地创建/销毁。在负载下,应用程序将停止使用消息。

在阅读了不同的文章之后,我们试图了解 JCA JMS 的作用。任何人都可以建议通过 JCA 实现 JMS 来解决问题,并将 JMS 作为 XA 资源来维护通过 JCA 适配器的连接和会话。

在我们的 spring JMS web 应用程序和 tomcat 服务器中,我们使用了来自 activemq 客户端库的 ActiveMQ PooledConnectionFactory 和 ActiveMQConnectionFactory。 我们看到会话频繁创建/销毁,这会阻止 JMS 使用消息。

下面的 spring bean sn-p 我们如何配置 spring JMS Template 和 DefaultMessageListenerContainer bean 连接到 connectionFactory。

<bean id="jmsQueueConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="ssl://localhost:61616"/>
    <property name="trustAllPackages" value="true"/>
</bean>
<bean id="dmDefaultMessageListenerContainer" class="com.crsoftwareinc.crs.core.jmsListener.DMDefaultMessageListenerContainer" >
   <property name="autoStartup"       value="false"/>
   <property name="concurrentConsumers" value="1" />
   <property name="maxConcurrentConsumers" value="5" />
   <property name="cacheLevelName"      value="CACHE_NONE"/>
   <property name="connectionFactory"   ref="jmsQueueConnectionFactory" />
   <property name="sessionTransacted"     value="true"/>
</bean>
<bean id="jmsTemplate"  class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="jmsQueueConnectionFactory"/>
    <property name="sessionTransacted" value="true"/>
</bean>

我们正在寻找一种解决方法,即如何在无缝维护连接和会话的生产部署中的 Spring Web 应用程序中将 JMS 与 ActiveMQ 代理一起使用?

【问题讨论】:

    标签: jms activemq spring-jms tomcat9 jca


    【解决方案1】:

    这是 Spring 的 JmsTemplate 的一个众所周知的问题。它在ActiveMQSpring's JmsTemplate JavaDoc 中都有记录,其中指出:

    注意:与此模板一起使用的 ConnectionFactory 应该返回池连接(或单个共享连接)以及池会话和 MessageProducers。否则,临时 JMS 操作的性能将受到影响。

    目前,您的 bean 都没有实际使用 JMS 连接池。一旦您实际配置了连接池并从您的 jmsTemplatedmDefaultMessageListenerContainer bean 中使用它,会话和连接的频繁创建和销毁应该停止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 2021-11-24
      • 2021-07-17
      • 2013-10-03
      • 2021-03-01
      • 2017-02-02
      • 1970-01-01
      相关资源
      最近更新 更多