WSo2: Rabbitmq возможно ли запрашивать из последовательности без прокси

#wso2 #wso2esb

#wso2 #wso2-esb

Вопрос:

Я работаю над простой интеграцией 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>

  

Ответ №1:

@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>
  

Пожалуйста, попробуйте выше и поделитесь своим отзывом.

Комментарии:

1. Большое вам спасибо за ваш ответ. ERROR_EXCEPTION = , конверт: <?xml version=’1.0′ encoding=’utf-8′?><soapenv:Envelope xmlns:soapenv=» schemas.xmlsoap.org/soap/envelope/… xmlns=» <span=»»>ws.apache.org/commons/ns/payload «>{‘Пи’:’е’}</text></soapenv:Body></soapenv:Envelope> [2020-11-08 12:19:30,859] информация {RabbitMQConsumer} — сообщение с ID сообщения: null и доставки тег: 2 на очереди: SalesOrderQueue будет отбрасывать или мертвыми буквами.

2. Итак, что я сделал, я намеренно установил неправильный пул соединений с БД для проверки. В принципе, то, что мне нужно, помещает сообщение в очередь до тех пор, пока оно не будет успешно сохранено в БД.

3. Когда он пытается вставить сообщение в БД, он получает «ошибку SQL при выполнении инструкции insert», как и ожидалось. Затем он пытается выполнить обработчик ошибок из-за возникшего исключения. После этого я получаю это исключение.

4. @MMRahman когда происходит сбой, он откатывает сообщение в очередь RabbitMQ. затем он снова проведет опрос и попытается сохранить его в базе данных. следовательно, вы можете гарантировать, что сообщение не будет отброшено, если сбой произойдет на постоянном уровне.

5. @MMRahman вы можете определить <parameter name="rabbitmq.message.max.dead.lettered.count">3</parameter> , чтобы установить максимальное повторное повторение, прежде чем отбрасывать сообщение.