Переопределение errorChannel, настроенного в @MessagingGateway - PullRequest
0 голосов
/ 30 мая 2018

Я настроил @ MessagingGateway , как показано ниже, для использования канала ошибок, который работает, как и ожидалось.

@MessagingGateway(errorChannel = "DefaultInboundErrorHandlerChannel")
public interface InboundMessagingGateway {

    @Gateway(requestChannel = "InboundEntryChannel")
    void receive(XferRes response);

}

В потоке я передаю объект в трансформатор, как показано ниже:

Шаг 1:

@Transformer(inputChannel = "InboundEntryChannel", outputChannel = "TransmissionLogChannel")
public CassandraEntity createEntity(
        org.springframework.messaging.Message<XferRes> message) throws ParseException {
    XferRes response = message.getPayload();
    CassandraEntity entity = new CassandraEntity();
    // ... getters & setter ommitted for brevity
    return entity;
}

Затем я обновляю сущность, как показано ниже: Шаг 2:

@ServiceActivator(inputChannel = "TransmissionLogChannel", outputChannel="PublishChannel")
public XferRes updateCassandraEntity(
        org.springframework.messaging.Message<XferRes> message) {
    XferRes response = message.getPayload();
    this.cassandraServiceImpl.update(response);
    return response;
}

И, наконец, я публикую в теме Кафки, как показано ниже: Шаг 3:

@ServiceActivator(inputChannel = "PublishChannel")
public void publish(org.springframework.messaging.Message<XferRes> message){

        XferRes response = message.getPayload();
        publisher.post(response);       
    }

В случае ошибки я отправляю сообщение в службу, которая публикует объект ошибки для входаПрием внутрь:

@ServiceActivator(inputChannel="defaultInboundErrorHandlerChannel")
public void handleInvalidRequest(org.springframework.messaging.Message<MessageHandlingException> message) throws ParseException {
    XferRes originalRequest = (XferRes) message.getPayload().getFailedMessage().getPayload();
    this.postToErrorBoard(originalRequest)
}

Если при возникает ошибка: Шаг 2: при обновлении БД, то я также хочу вызвать Шаг 3 .Тривиальным способом является удаление Step 2 и вызов для обновления базы данных из Step 1 .

Есть ли другой способ в Spring Integration, где я могу вызвать Шаг 3 независимо от того, произошла ошибка или нет.

1 Ответ

0 голосов
/ 30 мая 2018

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

Я имею в виду, что вы создаетеPublishSubscribeChannel @Bean и эти @ServiceActivator s используют имя для этого канала.

Более подробная информация содержится в Справочном руководстве .Обратите внимание на свойство ignoreFailures:

/**
 * Specify whether failures for one or more of the handlers should be
 * ignored. By default this is <code>false</code> meaning that an Exception
 * will be thrown whenever a handler fails. To override this and suppress
 * Exceptions, set the value to <code>true</code>.
 * @param ignoreFailures true if failures should be ignored.
 */
public void setIgnoreFailures(boolean ignoreFailures) {
...