【问题标题】:Service activator not processing the message from channel after getting the soapfaultException服务激活器在获取 soapfaultException 后未处理来自通道的消息
【发布时间】:2016-03-17 18:34:11
【问题描述】:

我正在使用 JMS 入站通道适配器,它使用来自 MQ 的消息并将这些消息发送到通道。此通道将此消息发送到服务激活器,SA 解析此消息并将对象发送到将调用 Web 服务的 WS 出站网关。

适配器每 30 秒读取 50 条消息,服务激活器将它们发送到 WS 出站网关。 如果 WS 调用成功,则所有消息都成功处理,如果 WS 在这种情况下发送soapFaultException 服务激活器没有处理其余消息并在下一轮(即 30 秒后)处理它们,不知道为什么。请帮忙

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

    我只能假设一种情况:

    1. 您的 JMS 入站通道适配器配置了 poller 用于 max-messages-per-poll="0"

    2. 因此它会在一个 JMS 事务中轮询尽可能多的消息,并将它们一一发送到通道。

    3. 由于它们都是在同一个线程中处理的,所以只有在整串之后才被确认(acked,commit)到JMS中。

    4. 在批处理过程中至少有一个异常意味着将所有消息回滚到队列中。

    您可以使用taskExecutor 并行处理它们,甚至更好地切换到消息驱动通道适配器,其中围绕一条消息的 TX 不会影响所有其他消息。

    【讨论】:

    • 感谢 Artem。你的假设是正确的。我使用的是消息驱动通道适配器,但我需要在每 15 分钟后使用一次队列,而且我无法配置该固定速率,所以是消息驱动的通道适配器有可能吗?
    • 好吧,如果你有这样的要求,我可以建议你不同的解决方案。将 ExpressionEvaluatingRequestHandlerAdvice 放在您的服务激活器上,并在出现任何错误时将消息重新发送失败消息返回队列。因此,任何好的消息都不会受到影响,仍然会在 JMS Broker 上得到确认。
    • 我还有一个解决方案。我使用了 int:aggregator 并且这个聚合器正在将 List queueMessageList 发送到我的服务激活器。在列表上迭代并通过 send 方法发送到通道,我将这个 send 方法放在 try 和 catch 块中,这正在工作。所以流程就像 inbound-channel-adapter ->inputChannel->int:aggregator->RouteAggrChannel ->服务激活器。此服务激活器将获取 List queueMessageList
    • 好的。那也很好。从集成的角度来看不是那么通用,但它是您的解决方案!我想,我们已经完成了这个问题。在我的回答中你还需要什么才能得到你的接受?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多