WSo2:Rabbitmq 是否可以在没有代理的情况下从序列中重新排队

WSo2: Rabbitmq is it possible to requeue from sequence without proxy

我正在研究简单的 Wso2 RabbitMQ 集成。我的入站端点使用消息并将其发送到序列。然后序列存储消息。另一个正在记录错误的失败序列。我正在尝试从序列中再次发送队列中的消息。

SalesOrderQueueInboundEP

<?xml version="1.0" encoding="UTF-8"?>
<inboundEndpoint name="SalesOrderQueueInboundEP" onError="SalesOrderQueueErrorSeq" protocol="rabbitmq" sequence="SalesOrderQueueProcessSeq" suspend="false" xmlns="http://ws.apache.org/ns/synapse">
    <parameters>
        <parameter name="sequential">true</parameter>
        <parameter name="coordination">true</parameter>
        <parameter name="rabbitmq.connection.factory">AMQPConnectionFactory</parameter>
        <parameter name="rabbitmq.server.host.name">localhost</parameter>
        <parameter name="rabbitmq.server.port">5672</parameter>
        <parameter name="rabbitmq.server.user.name">guest</parameter>
        <parameter name="rabbitmq.server.password">guest</parameter>
        <parameter name="rabbitmq.queue.name">SalesOrderQueue</parameter>
        <parameter name="rabbitmq.exchange.name">amq.direct</parameter>
        <parameter name="rabbitmq.message.content.type">application/xml</parameter>
    </parameters>
</inboundEndpoint>

SalesOrderQueueProcessSeq

 <?xml version="1.0" encoding="UTF-8"?>
<sequence name="SalesOrderQueueProcessSeq" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <log description="Log payload" level="full"/>
    <property expression="json-eval($)" name="body_json_property" scope="default" type="STRING"/>
    <sequence key="SalesDBSeq"/>
</sequence>


SalesOrderQueueErrorSeq

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="SalesOrderQueueErrorSeq" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <log description="Log error details in case of failure" level="full">
        <property name="MESSAGE" value="An unexpected error occurred."/>
        <property expression="$ctx:SYNAPSE_REST_API" name="REST_API"/>
        <property expression="$ctx:ERROR_CODE" name="ERROR_CODE"/>
        <property expression="$ctx:ERROR_MESSAGE" name="ERROR_MESSAGE"/>
        <property expression="$ctx:ERROR_DETAIL" name="ERROR_DETAIL"/>
        <property expression="$ctx:ERROR_EXCEPTION" name="ERROR_EXCEPTION"/>
    </log>
</sequence>

@NMRhman,

我认为如果消息转到错误序列,您需要回滚事务。

您可以将以下内容添加到入站序列中吗?

<parameter name="rabbitmq.queue.auto.ack">false</parameter>
<parameter name="rabbitmq.queue.auto.delete">false</parameter>

此外,添加以下属性,指示回滚错误序列中的消息。

<property name="SET_ROLLBACK_ONLY" value="true" scope="default" type="STRING"/>

修改序列如下

SalesOrderQueueInboundEP

<?xml version="1.0" encoding="UTF-8"?>
<inboundEndpoint name="SalesOrderQueueInboundEP" onError="SalesOrderQueueErrorSeq" protocol="rabbitmq" sequence="SalesOrderQueueProcessSeq" suspend="false" xmlns="http://ws.apache.org/ns/synapse">
    <parameters>
        <parameter name="sequential">true</parameter>
        <parameter name="coordination">true</parameter>
        <parameter name="rabbitmq.connection.factory">AMQPConnectionFactory</parameter>
        <parameter name="rabbitmq.server.host.name">localhost</parameter>
        <parameter name="rabbitmq.server.port">5672</parameter>
        <parameter name="rabbitmq.server.user.name">guest</parameter>
        <parameter name="rabbitmq.server.password">guest</parameter>
        <parameter name="rabbitmq.queue.name">SalesOrderQueue</parameter>
        <parameter name="rabbitmq.queue.auto.ack">false</parameter>
        <parameter name="rabbitmq.queue.auto.delete">false</parameter>
        <parameter name="rabbitmq.exchange.name">amq.direct</parameter>
        <parameter name="rabbitmq.message.content.type">application/xml</parameter>
    </parameters>
</inboundEndpoint>

SalesOrderQueueErrorSeq

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="SalesOrderQueueErrorSeq" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <log description="Log error details in case of failure" level="full">
        <property name="MESSAGE" value="An unexpected error occurred."/>
        <property expression="$ctx:SYNAPSE_REST_API" name="REST_API"/>
        <property expression="$ctx:ERROR_CODE" name="ERROR_CODE"/>
        <property expression="$ctx:ERROR_MESSAGE" name="ERROR_MESSAGE"/>
        <property expression="$ctx:ERROR_DETAIL" name="ERROR_DETAIL"/>
        <property expression="$ctx:ERROR_EXCEPTION" name="ERROR_EXCEPTION"/>
    </log>
    
   <property name="SET_ROLLBACK_ONLY" value="true" scope="default" type="STRING"/>
   
<drop/>
</sequence>

请尝试以上操作并分享您的反馈。