1

JMS Destination からメッセージを読み取り、Chuck Tasklet を使用して XML ファイルに書き込むように構成されたバッチ ジョブがあります。JMS リーダーは、JMSTemplate の receive メソッドを呼び出すカスタム実装です。JMS Broker として webMethods Broker を使用しています。バッチの実行中に、Broker Destination からのメッセージの読み取り中に作成された 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>

実際の問題を指摘する上での助けは素晴らしいでしょう。

4

1 に答える 1

0

最後の最後に(またはジョブが完了したときに)destroy()を呼び出します。JMS.SourceQueue.ConnectionFactorystep

メッセージごとに接続/コンシューマを作成することを避けるために、キャッシュ接続ファクトリを使用することをお勧めしますが、リソースを物理的に解放するタイミングを通知する必要があります。

于 2014-09-02T22:15:58.130 に答える