Выполнение потока мулов неожиданно прерывается из-за ошибки в отправке SMTP

Я хотел бы перехватывать ошибки из конечной точки SMTP (например, в случае, если она неправильно настроена или сервер не работает) и, когда это происходит, не допустить, чтобы сообщения проходили по обычному пути, а скорее попадали в поток исключений. Работает обработчик исключений, и сообщения направляются в поток исключений. Что неожиданно, так это то, что сообщение дублируется, а также продолжается с «нормальным» потоком. Я ожидаю, что это пойдет только в одном направлении: если электронное письмо было успешно отправлено, перейдите в обычную конечную точку, если отправка не удалась, перейдите в конечную точку исключения.

В приведенном ниже примере smtp завершается с ошибкой с UnknownHostException, и сообщение переходит в failureEndpoint, но сообщение по какой-то причине также попадает в outboundEndpoint:

<mule><!-- namespaces omitted for readability -->
    <flow name="sample-flowFlow1" doc:name="sample-flowFlow1">
        <inbound-endpoint ref="inboundEndpoint" doc:name="AMQP Consumer"/>
        <smtp:outbound-endpoint host="foobaz" to="[email protected]" from="[email protected]" subject="test" responseTimeout="10000" doc:name="SMTP"/>
        <outbound-endpoint ref="outboundEndpoint" doc:name="AMQP Publisher"/>
        <exception-strategy ref="FailureNotification" doc:name="Publish failure notification" />
    </flow>

    <catch-exception-strategy name="FailureNotification">
        <flow-ref name="FailureNotificationFlow" doc:name="Flow Reference" />
    </catch-exception-strategy>
    <sub-flow name="FailureNotificationFlow" doc:name="FailureNotificationFlow">
        <outbound-endpoint ref="failureEndpoint" doc:name="Failure Endpoint"/>
    </sub-flow>
</mule>

Когда сообщение публикуется в inboundEndpoint, а SMTP-коннектор неправильно настроен так, как это делается в приведенном примере, я хотел бы видеть сообщение исключительно в failureEndpoint, а не как в outboundEndpoint, так и в failureEndpoint. Как мне это сделать?

Версия мула: 3.4.0


person Sergey Evstifeev    schedule 29.05.2013    source источник


Ответы (2)


В этом потоке вы используете несколько исходящих. Поток не ждет ответа от smtp и по-прежнему продолжает следующий исходящий трафик.
Можно добавить условие, чтобы проверить, был ли smtp успешным, прежде чем продолжить исходящий трафик.

Модифицированный поток выглядит следующим образом. Попробуй это.

<flow name="sample-flowFlow1" doc:name="sample-flowFlow1">
    <inbound-endpoint ref="inboundEndpoint" doc:name="AMQP Consumer"/>
    <flow-ref name="mailingFlow" ></flow-ref>       
    <choice>
        <when expression="#[flowVars['mailingSuccess'] == 'failure']">
            <logger level="INFO" message="Mailing failed"></logger>
        </when>
        <otherwise>
            <outbound-endpoint ref="outboundEndpoint" doc:name="AMQP Publisher"/>       
        </otherwise>
    </choice>                   
</flow>

<flow name="mailingFlow" processingStrategy="synchronous" >
    <smtp:outbound-endpoint host="foobaz" to="[email protected]" from="[email protected]" subject="test" responseTimeout="10000" doc:name="SMTP"/>
    <catch-exception-strategy name="FailureNotification">
        <set-variable variableName="mailingSuccess" value="failure" ></set-variable>
        <flow-ref name="FailureNotificationFlow" doc:name="Flow Reference" />        
    </catch-exception-strategy>
</flow>

<sub-flow name="FailureNotificationFlow" doc:name="FailureNotificationFlow">
    <outbound-endpoint ref="failureEndpoint" doc:name="Failure Endpoint"/>
</sub-flow>

Надеюсь это поможет

person user1760178    schedule 29.05.2013
comment
Спасибо за отличный ответ, использование processingStrategy=synchronous действительно решило проблему! - person Sergey Evstifeev; 30.05.2013

Даже если поток будет синхронным, это не будет иметь никакого значения. Транспорт SMTP является асинхронным/односторонним в муле. Таким образом, вы не можете получить статус от транспорта, чтобы убедиться, что он был успешным, и на его основе направить поток. Если вам нужно маршрутизировать на основе статуса, вам лучше написать компонент электронной почты и встроить его в поток. Если компонент электронной почты генерирует исключение MessagingException, оно будет автоматически обработано потоком обработчика ошибок, и исходящая конечная точка не будет выполнена.

person Suresh    schedule 23.09.2013