1

我有一个批处理作业配置为从 JMS 目标读取消息并使用 Chuck Tasklet 写入 XML 文件。JMS 阅读器是自定义实现的,它反过来调用 JMSTemplate 的接收方法。我使用 webMethods Broker 作为 JMS Broker。在批处理运行期间,我们观察到在从代理目的地读取消息时创建的消费者会话在批处理完成时没有被销毁。它们只有在我关闭 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>

指出实际问题的任何帮助都会很棒。

4

1 回答 1

0

destroy()JMS.SourceQueue.ConnectionFactory最后一个step(或作业完成时)结束时调用。

建议使用缓存连接工厂来避免为每条消息创建连接/消费者,但需要告知何时物理释放资源。

于 2014-09-02T22:15:58.130 回答