Коннектор Mule4 IBM MQ: в режиме ACK "AUTO" - сообщение выполняется в цикле - бесконечность

У меня есть базовый поток с IBM MQ Connector со всеми настройками по умолчанию (Ack Mode AUTO). Если поток выдает ошибку между ними, сообщение запускается в цикле, не завершая поток.

Я ожидаю, так как это AUTO он должен завершить поток, увидев ошибку.

Насколько я помню, в более старой версии 3.6 он отлично работал в ACK mode AUTO

В Mule4 - При установке ACK Manual или Immediate он работает нормально.

Я попытался обновить IBM MQ Connector до v1.6.0а также все клиентские jar-файлы до последней версии "9.1.2.0". Все ведет себя одинаково.

Может ли кто-нибудь объяснить, является ли это поведение по умолчанию соединителя очереди IBM в Mule4 с ACK mode AUTO. Может ли кто-нибудь указать, что мне не хватает?

Я использую версию Mule: 4.2.2

   <ibm-mq:config name="IBM_MQ_Config" doc:name="IBM MQ Config" doc:id="a217b071-0d6b-4674-8696-0a74c8e8b4ee" sendCorrelationId="ALWAYS">
<ibm-mq:connection username="admin" password="passw0rd">
    <ibm-mq:connection-mode >
        <ibm-mq:client host="${mq.inbound.host}" queueManager="${mq.inbound.queueManager}" channel="${mq.inbound.channelName}" port="${mq.inbound.port}"/>
    </ibm-mq:connection-mode>
</ibm-mq:connection>

   <flow name="NotificationFlow" doc:id="a275ef91-8608-49a5-adcc-624c2dc6aacd" >
        <ibm-mq:listener doc:name="On New Message" doc:id="5de4cf1b-bd66-4519-b170-69f2159bd8b4" config-ref="IBM_MQ_Config" destination="testQ" ackMode="AUTO"/>
        <logger level="INFO" doc:name="Logger" doc:id="9c4c241b-d564-44ff-a2a3-6433e48ddf0a" />
        <ee:transform doc:name="Transform Message" doc:id="46c10c0c-3f0a-4184-a722-7caab39ca97d" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
import * from dw::Runtime
var result = []
output application/java
---
if(sizeOf(result) <= 0) fail('Data was empty') else result]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>

1 ответ

Решение

Похоже, это ожидаемый результат. Когда в потоке возникает ошибка, сообщение не подтверждается, поэтому оно возвращается в очередь. При следующем чтении будет получено то же неподтвержденное сообщение. Это называется ядовитым сообщением.

Со стороны приложения вы можете обработать ошибку, чтобы она не пузырилась в потоке, с помощью обработчика ошибок при продолжении. Таким образом, ошибка устраняется, и сообщение будет подтверждено, когда поток завершится.

Если вы хотите управлять повторной доставкой, вам необходимо настроить брокера (в данном случае IBM MQ) для обработки повторной доставки другим способом, например, отправкой в ​​DLQ. См. Комментарии в этом другом вопросе для получения более подробной информации.

Другие вопросы по тегам