在从属服务完成之前,如何保持消息流动

时间:2013-09-24 02:59:08

标签: spring spring-integration

我有一个消息通道,一个端点可以通过该通道向另一个端点发送消息。现在,每当消息到达通道时我想要调用内部业务服务,我们假设服务计算通过该通道的消息数。但是,我不想要的是让消息传递,直到服务方法返回。

哪种渠道和终端配置可以实现这一目标?

需要注意的几点:

  • 接收端的定期轮询器不符合 要求,因为轮询器既不知道消息的到达 进入渠道,也不知道服务方法何时返回
  • 服务方法对邮件内容不感兴趣 只要一条消息,就需要调用它(没有args) 到达。它都没有返回任何东西。这就是使用过滤器的原因 将不是一个理想的解决方案(过滤器只是继续前进 任何传入的消息并在其间调用服务方法)

编辑:服务方法可能发生的一件事是它可能会抛出异常。在这种情况下,不应该放弃消息,而是需要做其他事情。但是异常的原因与消息有效负载无关,因为它对有效负载没有任何作用。例如,它只是递增消息计数器。这就是为什么我提到消息本身不应该(理想情况下)被发送到服务方法,它只需要被适当地触发,并且一旦服务方法成功返回,通道应该允许将消息分派到最终端点。 (我只是想,而不是有可能抛出异常的服务方法,你可以考虑返回一个布尔值;即如果传递则为true,否则为false)

2 个答案:

答案 0 :(得分:0)

如果服务方法对有效负载不感兴趣,也没有返回任何内容,为什么不将服务调用包装成一个总是返回true的简单过滤器?

答案 1 :(得分:0)

你的意思并不完全清楚 - 你说服务没有返回任何结果,但你希望消息“通过”。没有导致线性流动意味着流程结束 - 没有结果消息流过。

如果您的意思是想要通过一条消息呼叫一个服务,然后将相同的消息传递给其他服务,那么只需将该频道设为<publish-subscribe-channel/>即可。订阅第一个服务(order="1") - 没有输出通道,第二个服务(order="2")。当第一个服务返回时,消息将被发送到第二个服务(但是,您不能添加任务执行程序)。

请注意,虽然邮件本身是不可变的,但有效负载可能不是 - 这意味着第二个服务将看到第一个服务所做的任何更改。

编辑:这是默认行为 - 如果第一个订阅者抛出异常,该消息将不会转到下一个订阅者(可以通过设置ignore-failures="true"来修改此行为) 。缺省值是抛出异常,可由入站端点(流程开始处)的error-channel处理,或者由中间错误处理网关处理。

如果您不希望第一个服务“看到”该消息,请在其之前添加转换器 - 第二个订户仍将获得原始消息。