Использование фильтра с каналом сброса в 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;
}
Это некрасиво и многословно, поэтому вопрос в том, что я сделал неправильно здесь и как я должен был сделать это в лучшем, более чистом, более элегантном решении?
Ура.
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