0

WSO2Esb と WSO2DSS を使用してデータベースに読み取り値を挿入しています。モバイル側から読み取り要求を取得している間、挿入は正常に機能しています。200 と一意の値の応答が必要です。その場合、モバイル側のクライアントがリクエストをもう一度送信するので、プロキシがこのリクエストをデータベースに送信します。したがって、2 つまたは 3 つの読み取りごとに重複する値を格納するデータベースは、クライアントにとって完全に不公平です。これに対する解決策を見つける

<!-- The example shows WSO2 ESB acting as an Idempotent Receiver -->
<definitions xmlns="http://ws.apache.org/ns/synapse">
    <proxy name="IdempotencyReceivingProxy">
        <target>
            <inSequence>
                <log level="full"/>
                <!-- Store all messages in an Jmsmemory message store -->
                <store messageStore="MyStore"/>
            </inSequence>
            <outSequence>
                <send/>
            </outSequence>
        </target>           
    </proxy>
    <!-- Further mediation of messages are done in this sequence -->
    <sequence name="next_seq">
        <send>
            <endpoint>
                <address uri="http://localhost:9000/services/SimpleStockQuoteService"/>
            </endpoint>
        </send>
    </sequence>
    <messageStore name="MyStore"/>
    <!-- Resequencing Processor takes the next sequence number and hand over to "next_seq" and preserve Idempotency -->
    <messageProcessor
            class="org.apache.synapse.message.processors.resequence.ResequencingProcessor"
            name="ResequencingProcessor" messageStore="MyStore"> 
        <parameter name="interval">2000</parameter>
        <!-- Takes the sequence number using Xpath -->
        <parameter name="seqNumXpath" xmlns:m0="http://services.samples" expression="substring-after(//m0:placeOrder/m0:order/m0:symbol,'-')"/>
        <parameter name="nextEsbSequence">next_seq</parameter>
        <parameter name="deleteDuplicateMessages">true</parameter> 
    </messageProcessor>
</definitions>

このために、私はこのリンクをたどりましたhttp://docs.wso2.org/wiki/display/IntegrationPatterns/Idempotent+Receiver 私の要件に適していますか

4

2 に答える 2

0

これはあなたの要件に合わないと思います。seqNumXpathリシーケンス プロセッサが行うことは、プロパティの番号に従ってメッセージを並べ替えることです。したがって、メッセージには数値が含まれている必要があり、xpath 式を使用してこの数値を取得する必要があります。パラメータが true に設定されている場合、パラメータdeleteDuplicateMessagesから取得したものと同じシーケンス番号を持つ重複メッセージを削除しseqNumXpathます。

あなたの場合、ストア アンド フォワードシナリオを使用して、クライアントが複数のリクエストを送信するのを防ぐことができます。FORCE_SC_ACCEPTEDプロキシ サービスでプロパティを true に設定して、クライアントに常に 202 応答を返します。次に、メッセージは msg ストアに保存され、メッセージ プロセッサを使用して転送されます。

http://docs.wso2.org/wiki/display/ESB470/Store+and+Forward+Using+JMS+Message+Stores http://wso2.com/library/articles/2011/10/implementing-store-forward -messaging-patterns-wso2esb-part-1

于 2013-08-13T09:48:09.870 に答える
0

Apache Camel にはべき等コンシューマーhttp://camel.apache.org/idempotent-consumer.htmlがあり、IdempotentRepository を使用して以前に見られたかどうかを確認します。存在する場合、メッセージは消費されます。そうでない場合は、メッセージが処理され、ID がリポジトリに追加されます。http://camel.apache.org/sql-component.html、特にセクション「JDBC ベースのべき等リポジトリの使用」を参照してください。これはまさに私たちが必要としているものです。私たちの場合、重複メッセージは数日後に到着する可能性がありますが (モバイル デバイスなどのオフライン クライアント)、各メッセージには重複を検出するために使用できる UUID フィールドがあります。

wso2esb で利用可能な同様の実装はありますか? はいの場合、ドキュメントへのポインタはありますか? いいえの場合、wso2esb を使用しているときにこの動作を取得するための代替手段は何ですか?

于 2013-08-20T12:47:33.720 に答える