【问题标题】:Spring integration wire tap a slack notificationSpring集成线点击一个松弛通知
【发布时间】:2021-09-19 07:07:18
【问题描述】:

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

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

声明一个队列通道来接收需要发送的消息

@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 并拥有那个订阅了频道。简化成会更好吗?

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

我不需要这个选项的队列通道,但我不确定是否正确使用了wireTap。

【问题讨论】:

    标签: java spring spring-integration spring-integration-dsl


    【解决方案1】:

    我想说这不是按设计使用窃听器的方式。请参阅文档: https://www.enterpriseintegrationpatterns.com/patterns/messaging/WireTap.html

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

    根据您当前的配置,您只需忽略发布到该窃听器的原始消息,而是创建您自己的作为该 sendSlack() 工厂方法的参数。其中,本质上只是一个静态值,因此拥有如此复杂的分布式逻辑只是为了发送静态字符串毫无意义。 (此时我可能错了,您给 slack 的消息并不像问题中的代码 sn-p 那样静态...)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-25
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      相关资源
      最近更新 更多