1

Mule 3.3.1 を使用しています

Quartz スケジューラを使用してポーリングする予定のキューから利用可能なすべてのメッセージを読み取るコンポーネントを作成しようとしています。

これが私のコードです。

    @Override
public Object onCall(MuleEventContext muleEventContext) throws Exception {
    MuleMessage[] messages = null;

    MuleMessage result = muleEventContext.getMessage();
    do {
        if (result == null) {
            break;
        }
        if (result instanceof MuleMessageCollection) {
            MuleMessageCollection resultsCollection = (MuleMessageCollection) result;
            System.out.println("Number of messages: " + resultsCollection.size());
            messages = resultsCollection.getMessagesAsArray();
        } else {
            messages = new MuleMessage[1];
            messages[0] = result;
        }
        result = muleEventContext.getMessage();
    } while (result !=null);
    return messages;
}

残念ながら、最初のメッセージで無期限にループします。考え?

4

1 に答える 1

2

投稿で提供されている onCall() メソッドは、無限にループするためです。

muleEventContext.getMessage()

常に MuleMessage を返します。そして、ループは無限に入ります。

ここでの MuleEventContext オブジェクトは、現在の要素を読み取った後にポインタが次の要素を指すイテレータまたはストリームではありません。

利用可能なすべてのメッセージをキューから読み取るため。キューをポーリングしてすべてのメッセージを読み取ることにより、JMS インバウンドを読み取ることができます。ただし、キューの各メッセージは、JMS インバウンドからの 1 つの反復 (1 つのメッセージ) になることに注意してください。

すべての Queue メッセージをオブジェクトのコレクションとして収集してから続行する場合、それは別の話です。これは、コンポーネント コードでは実行できません。

すべてのメッセージをコレクションとして収集してから処理を開始する場合は 、受信時に mule のcollection-aggregatorなどを使用してみてください。

お役に立てれば。

于 2013-09-09T18:30:20.410 に答える