spring集成线轻触松弛通知

brgchamk  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(299)

对于我正在构建的应用程序,我需要能够发送slack消息,指示处理文件的进度和成功/失败。
我没有找到一个完全直截了当的方法,所以我做了以下工作:
声明队列通道以接收需要发送的消息

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

发送到该通道的每条消息都将作为松弛消息发送。要将消息推送到那里,我正在进行如下窃听:

@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");
}

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

laik7k3q

laik7k3q1#

我要说的是,这不是使用电线抽头的方式,因为它是设计的。见文件: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

相关问题