2016-12-15 6 views
1

約100個のジョブに分割された約75の分割ステップを持つアプリケーションがあります。JmsOutboundGateway:手動起動と停止

<int-jms:outbound-gateway 
    id="outbound-gateway_1" 
    auto-startup="true" 
    connection-factory="jmsConnectionFactory" 
    request-channel="jms.requests_1" 
    request-destination="jms.requestsQueue" 
    reply-channel="jms.reply_1" 
    reply-destination="jms.repliesQueue" 
    receive-timeout="${timeout}" 
    correlation-key="JMSCorrelationID" > 
    <int-jms:reply-listener receive-timeout="1000"/> 
</int-jms:outbound-gateway> 

autostart = "true"の場合、各送信ゲートウェイのreplyListenerスレッドが表示されます。この余分な負荷とリソース消費を取り除くために、autostart = "false"に変更し、beforeStepおよびafterStepメソッドでゲートウェイを開始および停止するパーティション・ステップのステップ・リスナーを追加しました。サーバーの起動時に、replyListenerスレッドは期待どおりに存在しません。ステップ実行中に表示されますが、発信ゲートウェイで停止するようにコールした後は削除されません(長時間待った後でも)。

replyListenerをクリーンアップする必要がありますか?

+0

これらのスレッドがまだ存在することをどのように知っていますか? Spring Integrationのどのバージョンを使用していますか?ありがとう –

答えて

0

OK、どういう意味ですか。 DefaultMessageListenerContainer.AsyncMessageListenerInvoker.executeOngoingLoop()

ポイントで

while ((active = isActive()) && !isRunning()) { 
    if (interrupted) { 
     throw new IllegalStateException("Thread was interrupted while waiting for " + 
       "a restart of the listener container, but container is still stopped"); 
    } 
    if (!wasWaiting) { 
      decreaseActiveInvokerCount(); 
    } 
    wasWaiting = true; 
    try { 
     lifecycleMonitor.wait(); 
    } 
    catch (InterruptedException ex) { 
     // Re-interrupt current thread, to allow other threads to react. 
     Thread.currentThread().interrupt(); 
     interrupted = true; 
    } 
} 

lifecycleMonitor.wait();あるとIllegalStateExceptionのメッセージに注意を払う:のようにそれは見えます。

このようなデザインの目的はわかりませんが、そのままで生きていなければ、選択肢はありません。

start()のロジックは、this.pausedTasksローカルキャッシュに基づいています。これは、コンテナ!this.runningの場合はdoInitialize()の間に埋められます。

どういうわけか論理を変えなければならないと思ったら、JIRAをつけてください。

+0

私たちのすべてのパーティションパーティションジョブは、同じJMSキューをリッスンし、異なるチャネルを使用します。アウトバウンドゲートウェイが同じreplyListenerインスタンスを使用するように設定する方法はありますか?実行する必要があるのは1つだけです(開始と終了を取り除くには?) –

+0

'

+0

短命のタスクを好む外部タスクエグゼキュータを使用するか、または「max-messages」を明示的に設定する外部タスクエグゼキュータを使用してください。 -per-task'(このタイプのエグゼキュータでは10に設定されます)タスクごとの最大メッセージ数が0より大きい場合、スレッドはそのモニタでブロックするのではなく、終了します(またはプールに戻す)。 –

関連する問題