#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>
, чтобы установить максимальное повторное повторение, прежде чем отбрасывать сообщение.