Spring: потребительские сеансы / соединения JMS не удаляются в Message Broker после завершения пакетного задания
У меня есть пакетное задание, настроенное для чтения сообщений из пункта назначения JMS и записи в файл XML с помощью Chuck Tasklet. Считыватель JMS реализован на заказ, и inturn вызывает метод приема JMSTemplate. Я использую WebMethods Broker в качестве JMS Broker. Во время выполнения пакета мы заметили, что сеанс Consumer, созданный во время чтения сообщений из пункта назначения брокера, не уничтожается по завершении пакета. Они уничтожаются только после того, как я отключил JVM. Я предоставил более подробную информацию ниже,
Конфигурация JMS Spring XML:
<bean id="JMS.SourceQueue.JndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<map>
<entry key="java.naming.provider.url" value="wmjmsnaming://Broker #1@X.X.X.X:6849" />
<entry key="java.naming.factory.initial" value="com.webmethods.jms.naming.WmJmsNamingCtxFactory" />
<entry key="com.webmethods.jms.naming.clientgroup" value="IS-JMS" />
</map>
</property>
</bean>
<bean id="JMS.SourceQueue.JmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="JMS.SourceQueue.JndiTemplate" />
<property name="jndiName" value="SmartBatchConnectionFactory" />
<property name="lookupOnStartup" value="true" />
<property name="cache" value="false" />
<property name="proxyInterface" value="javax.jms.ConnectionFactory" />
</bean>
<bean id="JMS.SourceQueue.ConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg ref="JMS.SourceQueue.JmsConnectionFactory" />
</bean>
<bean id="JMS.SourceQueue.DefaultDestination" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="JMS.SourceQueue.JndiTemplate" />
<property name="jndiName" value="SourceQueue" />
</bean>
<bean id="JMS.SourceQueue.MessageTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="JMS.SourceQueue.ConnectionFactory" />
<property name="receiveTimeout" value="10000" />
<property name="sessionTransacted" value="true" />
<property name="defaultDestination" ref="JMS.SourceQueue.DefaultDestination" />
</bean>
Любая помощь в указании на актуальную проблему была бы отличной.
1 ответ
Вызов destroy()
на JMS.SourceQueue.ConnectionFactory
в конце последнего step
(или иначе, когда работа завершена).
Рекомендуется использовать фабрику соединений для кэширования, чтобы избежать создания соединений / потребителей для каждого сообщения, но необходимо указать, когда физически освобождать ресурсы.