java - Spring集成线点击一个松弛通知
问题描述
对于我正在构建的应用程序,我需要能够发送松弛消息,指示已处理文件的进度和成功/失败。
我没有找到一种完全直接的方法,所以我正在执行以下操作:
声明一个队列通道来接收需要发送的消息
@Bean
MessageChannel slackChannel() {
return MessageChannels.queue(SLACK_CHANNEL).get();
}
发送到该频道的每条消息都将作为 Slack 消息发送。为了在那里推送消息,我正在做一个wireTap,比如:
@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
具有发送消息的所有逻辑。我喜欢这种方法,因为我可以从不同的地方将消息发送到松弛通道并以相同的方式进行处理,但我不确定是否可以让私有方法sendSlack
返回 IntegrationFlow 并拥有订阅的 bean这个频道。简化为更好吗?
private IntegrationFlow sendSlack(String message) {
return sf -> sf
.transform(Message.class, m -> MessageBuilder.createMessage(message, m.getHeaders()))
.handle(slackService, "send");
}
我不需要这个选项的队列通道,但我不确定是否正确使用了wireTap。
解决方案
我想说这不是按设计使用窃听器的方式。请参阅文档: https ://www.enterpriseintegrationpatterns.com/patterns/messaging/WireTap.html
您如何检查在点对点通道上传输的消息?
根据您当前的配置,您只需忽略发布到该窃听器的原始消息,而是创建您自己的作为该sendSlack()
工厂方法的 arg。其中,本质上只是一个静态值,因此拥有如此复杂的分布式逻辑只是为了发送静态字符串毫无意义。(此时我可能是错的,您对 slack 的消息并不像问题中的代码片段那样静态...)
您可以考虑使用 a@MessagingGateway
作为合约来区分和隧道业务逻辑:https ://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway
推荐阅读
- javascript - Angular http.get() 检测调用超时
- excel - 如何从表中提取值并创建新表
- python - “CMRESHandler”对象没有属性“_timer”
- jquery - 在jquery中获取段落的文本
- typo3 - 当类别用于数据页面时,TYPO3 9 中 tx_news 的站点地图
- c++ - 如何从 gtkmm 树视图中获取选定的行
- react-native - React Native 错误:ENOENT:没有这样的文件或目录
- java - 好奇为什么while循环只打印最后一项?
- c - 预计 2 个编译器错误 ';' 在声明列表和字段“x”的末尾声明为函数?
- java - 连接到 Google SQL 时无法从数据源确定 jdbc url