0

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

什么样的通道和端点配置可以实现这一点?

有几点需要注意:

  • 接收端的周期性轮询器不满足要求,因为轮询器既不知道消息到达通道,也不知道服务方法何时返回
  • 服务方法对消息的内容不感兴趣。
    只需要在消息
    到达时立即调用它(没有参数)。它也不返回任何东西。这就是为什么使用过滤器不是一个理想的解决方案(过滤器只是转发任何传入的消息并在两者之间调用服务方法)

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

4

2 回答 2

0

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

于 2013-09-24T08:00:21.320 回答
0

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

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

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

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

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

于 2013-09-24T12:27:59.847 回答