1

Mule (v. 2.2.1) でさらに処理するために JMS キュー (Websphere MQ) からメッセージを取得すると、誤ったエラーが発生します。以下に、影響を受けるサービスと Mule ログからの抜粋を示します。「DispatchThread: 1」の最初のセグメントは、サービスが期待どおりに機能した場合であり、「DispatchThread: 6」の 2 番目のケースは、メッセージが失われた、つまり処理されなかった場合です。

ログに示されているように、メッセージは両方のケースで処理するために processFooBar.service のイベントとしてキューに入れられますが、後者の場合、それ以上の処理のために取得されることはありません。実際の例では、ほとんどすぐにキューから取り出されて処理されます。

これは、スレッド化プロファイル (つまり、receiver-threading-profile など) の不均衡が原因であると思われますが、同時に、かなり漠然とした説明であると感じています。メッセージが跡形もなく失われる可能性があることは少し心配です。システムの負荷が増加した場合、スレッドの数を増やしても同じ問題が発生する可能性があります。

私たちの疑いが確認できれば幸いです。また、誰かが同じ問題を経験した場合、彼らはそれに対して何をしましたか? Mule 3 にアップグレードしますが、この問題は Mule 3 でも変わらないと思いますか?

サービス定義:

<service name="processFooBar">
    <inbound>
        <jms:inbound-endpoint queue="A.FROM.BAR"
                              connector-ref="fooConnector"
                              disableTemporaryReplyToDestinations="true">
            <transformers>
                <transformer ref="messageLogger"/>
                <transformer ref="jmsMessageToObjectTransformer"/>
                ...
                ..
            </transformers>
        </jms:inbound-endpoint>
    </inbound>
    ...
    ..
</service>

ログの抽出:

...
..
@ESB-: 2013-06-24 10:31:37,319 DEBUG [DispatchThread: 1] org.mule.service.AbstractService - Service: processFooBar has received asynchronous event on: jms://A.FROM.BAR
@ESB-: 2013-06-24 10:31:37,319 DEBUG [DispatchThread: 1] org.mule.model.seda.SedaService - Service: processFooBar has received asynchronous event on: jms://A.FROM.BAR
@ESB-: 2013-06-24 10:31:37,319 DEBUG [DispatchThread: 1] org.mule.model.seda.SedaService - Service processFooBar putting event on queue processFooBar.service: MuleEvent: ..., endpointEncoding=UTF-8}
@ESB-: 2013-06-24 10:31:37,321 DEBUG [processFooBar.1] org.mule.model.seda.SedaService - Service: processFooBar dequeued event on: jms://A.FROM.BAR
@ESB-: 2013-06-24 10:31:37,331 DEBUG [processFooBar.1] org.mule.model.seda.SedaService - Service processFooBar polling queue processFooBar.service, timeout = 10,000
@ESB-: 2013-06-24 10:31:37,339 DEBUG [processFooBar.2] org.mule.DefaultMuleMessage - new copy of message for Thread[processFooBar.2,5,main]
@ESB-: 2013-06-24 10:31:37,367 DEBUG [processFooBar.2] org.mule.transformer.AbstractTransformer - Setting transformer name to: fooDecoderTransformer
@ESB-: 2013-06-24 10:31:37,368 DEBUG [processFooBar.2] org.mule.transformer.AbstractTransformer - java.lang.Object has been added as source type for this transformer, there will be no source type checking performed
@ESB-: 2013-06-24 10:31:37,368 DEBUG [processFooBar.2] org.mule.transformer.AbstractTransformer - Setting transformer name to: objectToStringTransformer
...
..
@ESB-: 2013-06-24 13:19:51,896 DEBUG [DispatchThread: 6] org.mule.service.AbstractService - Service: processFooBar has received asynchronous event on: jms://FOMS.FROM.FSM.Bar
@ESB-: 2013-06-24 13:19:51,896 DEBUG [DispatchThread: 6] org.mule.model.seda.SedaService - Service: processFooBar has received asynchronous event on: jms://FOMS.FROM.FSM.Bar
@ESB-: 2013-06-24 13:19:51,897 DEBUG [DispatchThread: 6] org.mule.model.seda.SedaService - Service processFooBar putting event on queue processFooBar.service: MuleEvent: ..., endpointEncoding=UTF-8}
...
..
4

1 に答える 1

0

Mule の最大スレッド数はデフォルトで 16 に制限されているため、次のように変更できます。

まずできること

  1. JMS コネクターで numberOfConsumers 属性を設定する
  2. JMS コネクタの receiver-threading-profile 要素に maxThreadsActive 属性を設定します。
<jms:activemq-connector name="jmsConnector" numberOfConsumers="15" brokerURL="vm://localhost">
    <receiver-threading-profile maxThreadsActive="15"/>
</jms:activemq-connector>

別の解決策は、フロー処理戦略を設定することです。以下のリンクを参照してください: https://docs.mulesoft.com/mule-user-guide/v/3.5/flow-processing-strategies

于 2015-10-26T12:14:13.693 に答える