2

私は Mule を初めて使用し、リスナーが受信できる Mule メッセージ バスにメッセージをディアパッチするフローを必要とする問題に取り組んでおり、ワーカーが完了したときにそれらのメッセージの正常な処理の通知も受信します。主な基準は、「ディスパッチャ フロー」がその作業を継続することをブロックされないことです (潜在的に他のリスナーのために他の異なるメッセージをバスに配置する)。

MuleStudio (以下) で実行しているテスト アプリがあります。これは、私が達成しようとしているものの基本を簡略化してカプセル化したものです。これは非常に単純な 2 フロー アプリで、リクエストとリプライを使用して、2 番目のフローがリプライをメイン フローに送り返すことができるようにします。ここでの主な問題は、メイン フローのスレッドがブロックされ、応答が返されるまで何も実行できないことです。メインフローの別のスレッドで応答を返す方法はありますか、それとも基準を考慮してこれを達成する他の方法はありますか?

助けやポインタをありがとう;-)

...

<!-- simple Groovy transformer that changes the msg payload to a greeting w/ the current time-->
<scripting:transformer name="toCurrentTime">
    <scripting:script engine="groovy">
        import java.text.SimpleDateFormat;

        def DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";    
        def cal = Calendar.getInstance();
        def sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
        return "Response @ time " + sdf.format(cal.getTime())

    </scripting:script>    
</scripting:transformer>


<!-- 
    note : neither of the following are allowed on the flow b/c of the request-reply    
    processingStrategy="synchronous"
    processingStrategy="queued-asynchronous"
-->

<flow name="main" doc:name="main">

    <http:inbound-endpoint ref="httpEventInjector" doc:name="HTTP"/>

    <logger message="starting main flow" level="INFO"/>

    <request-reply storePrefix="mainFlow">  
        <vm:outbound-endpoint path="worker"></vm:outbound-endpoint>
        <vm:inbound-endpoint path="reply"></vm:inbound-endpoint> 
    </request-reply>


    <!--  processing continues once we get the response on the 'reply' channel above from the worker -->    
    <!--  generate the response for the browser -->    
    <logger message="finishing main flow w/ browser response" level="INFO"/>        
    <response>
        <transformer ref="toCurrentTime"/>
    </response>
</flow>


<flow name="worker" doc:name="worker">      
    <vm:inbound-endpoint path="worker"/>

    <logger message="starting worker task(s) ...." level="INFO"/>

    <scripting:component doc:name="thread-sleep(10s)">
        <scripting:script engine="Groovy">
            System.out.println "about to sleep @ time" + System.currentTimeMillis()
            Thread.sleep(10000);    
            System.out.println "done sleeping @ time" + System.currentTimeMillis()
        </scripting:script>
    </scripting:component>


    <logger message="finishing up worker task(s) ...." level="INFO"/>
</flow>    

4

1 に答える 1

2

継続を使用して、目的を達成できます。このトピックに関するブログ記事を書きました。

于 2014-01-07T20:49:13.113 に答える