我们可以使用Idempotent Receiver对抗与ActiveMq的Jms消息

时间:2013-08-13 07:08:01

标签: wso2 wso2esb wso2dss

我使用WSO2Esb和WSO2DSS在数据库中插入读数我的插入工作正常 当我从移动端获取请求时,我需要具有200和唯一值的响应 有些时候连接失败后插入意味着插入已经结束但客户端没有得到响应,在这种情况下移动端客户端再次发送请求,所以我的代理再次将此请求发送到数据库。所以我的数据库存储每2或3个读数的重复值它对客户完全不公平,我找到了一个小解决方案 使用Idempotent服务我们可以找到这个

的解决方案
<!-- 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 是否适合我的要求

2 个答案:

答案 0 :(得分:0)

我认为这不符合您的要求。重新排序处理器的作用是,根据seqNumXpath属性中的数字对消息进行排序。因此消息应包含一个数字,您应该使用xpath表达式获取此数字。当deleteDuplicateMessages参数设置为true时,它将删除与从seqNumXpath参数获得的序列号相同的重复邮件。

在您的情况下,您可以使用store and forward方案来阻止客户端发送多个请求。在代理服务中将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

答案 1 :(得分:0)

Apache Camel有一个幂等消费者http://camel.apache.org/idempotent-consumer.html,它使用一个IdempotentRepository来查看之前是否已经看过它;如果有,则消息被消耗;如果不是,则处理该消息并将ID添加到存储库。请查看http://camel.apache.org/sql-component.html特别是“使用基于JDBC的幂等存储库”部分。这正是我们所需要的。因为在我们的情况下,重复的消息甚至可以在几天之后到达(离线客户端,例如移动设备),但是每个消息具有可用于检测重复的UUID字段。

wso2esb中是否有类似的实现?如果是,任何指向文档的指针?如果在使用wso2esb时没有我们的替代方法来获取此行为?