【发布时间】: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