Использование фильтра с каналом сброса в Spring Integration DSL



Я не знаю, касается ли этот вопрос spring-integration, spring-integration-dsl или обоих, поэтому я просто добавил 2 тега...



Сегодня я трачу значительное количество времени, сначала делая простой поток с фильтром



StandardIntegrationFlow flow = IntegrationFlows.from(...)
.filter(messagingFilter)
.transform(transformer)
.handle((m) -> {
(...)
})
.get();


MessagingFilter является очень простой реализацией MessageSelector. Пока все идет хорошо, времени почти нет. Но потом я хотел записать сообщение на случай, если MessageSelector вернет false, и вот тут я застрял.



Через некоторое время время, когда я закончил с этим:



StandardIntegrationFlow flow = IntegrationFlows.from(...)
.filter(messagingFilters, fs -> fs.discardFlow( i -> i.channel(discardChannel()))
.transform(transformer)
.handle((m) -> {
(...)
})
.get();

(...)

public MessageChannel discardChannel() {
MessageChannel channel = new MessageChannel(){
@Override
public boolean send(Message<?> message) {
log.warn((String) message.getPayload().get("msg-failure"));
return true;
}
@Override
public boolean send(Message<?> message, long timeout) {
return this.send(message);
}
};
return channel;
}


Это некрасиво и многословно, поэтому вопрос в том, что я сделал неправильно здесь и как я должен был сделать это в лучшем, более чистом, более элегантном решении?

Ура.

392   1  

1 ответ:

Ваша проблема в том, что вы не видите, что Filter является реализацией шаблона EI, и максимум, что он может сделать, это отправить отброшенное сообщение в какой-то канал. Он ничего не будет регистрировать, потому что этот подход уже не будет основан на обмене сообщениями.

Самый простой способ, который вам нужен для вашего прецедента, это:

.discardFlow(df -> df
        .handle(message -> log.warn((String) message.getPayload().get("msg-failure")))))

Это ваша логика, чтобы просто войти. Некоторые другие люди могли бы сделать более сложную логику. Так что, в конце концов, вы привыкнете кканалу абстракции между конечная точка.

Я согласен, что подход new MessageChannel() {} Неправильный. Регистрация действительно должна быть сделана в MessageHandler вместо этого. Это и есть уровень ответственности службы. Также не забывайте, что есть LoggingHandler, который через Java DSL может быть достигнут как:
 .filter(messagingFilters, fs -> fs.discardFlow( i -> i.log(message -> (String) message.getPayload().get("msg-failure"))))

Comments

    Ничего не найдено.