Я настроил @ 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 независимо от того, произошла ошибка или нет.