弹簧集成电线敲击松弛通知



对于我正在构建的应用程序,我需要能够发送指示已处理文件的进度和成功/失败的松弛消息。

我没有找到一种完全简单的方法,所以我正在做以下事情:

声明队列通道以接收需要发送的消息

@Bean
MessageChannel slackChannel() {
return MessageChannels.queue(SLACK_CHANNEL).get();
}

发送到该频道的每条消息都将作为Slack消息发送。为了在那里推送消息,我正在做一个类似于的窃听

@Bean
IntegrationFlow startFlow() {
return IntegrationFlows
...
.wireTap(sendSlack("A nice message describing what's happening")
...
}
private IntegrationFlow sendSlack(String message) {
return sf -> sf
.transform(Message.class, m -> MessageBuilder.createMessage(message, m.getHeaders()))
.channel(SLACK_CHANNEL);
}

最后,松弛流:

@Bean
IntegrationFlow slackFlow() {
return IntegrationFlows.from(SLACK_CHANNEL)
.handle(slackService, "send")
.get();
}

SlackService具有发送消息的所有逻辑。我喜欢这种方法,因为我可以从不同的地方向slack通道发送消息,并以相同的方式进行处理,但我不确定让私有方法sendSlack返回IntegrationFlow并订阅该通道的bean是否可以。简化为会更好吗?

private IntegrationFlow sendSlack(String message) {
return sf -> sf
.transform(Message.class, m -> MessageBuilder.createMessage(message, m.getHeaders()))
.handle(slackService, "send");
}

我不需要带有此选项的队列通道,但我不确定窃听器的使用是否正确。

我想说,这不是按设计使用抽头的方法。请参阅文档:https://www.enterpriseintegrationpatterns.com/patterns/messaging/WireTap.html

如何检查点对点通道上传输的消息?

根据当前配置,您只需忽略发布到该抽头的原始消息,而是创建自己的消息作为sendSlack()工厂方法的参数。本质上,它只是一个静态值,所以拥有如此复杂和分布式的逻辑来发送静态字符串是毫无意义的。(我可能在这一点上错了,你给slack的信息并不像问题中的代码片段那样静态…(

您可以考虑使用@MessagingGateway作为契约来区分和隧道化业务逻辑:https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway

最新更新