【问题标题】:Guaranteed Delivery of messages using Redis使用 Redis 保证消息传递
【发布时间】:2018-09-05 06:35:00
【问题描述】:

我正在尝试使 QueueChannel 的消息持久化,即使应用程序被杀死,我也需要在应用程序再次启动后继续处理消息。 我知道使用 JdbcChannelMessageStore 支持的 QueueChannel 很容易完成,该 JdbcChannelMessageStore 由带有事务轮询器的 ServiceActivator 处理,但是我必须使用 Redis 来完成此任务

鉴于此,我尝试了由带有事务轮询器的 ServiceActivator 处理的 RedisChannelMessageStore 支持的 QueueChannel。它适用于队列中要处理的消息,但在 kill 时正在处理的消息会丢失。

我想知道在这种情况下是否可以使用任何弹簧集成组件或模式。

我正在考虑手动操作的可能性。当消息进入时,我将其放入 Redis,当它完成处理时我将其删除,并在应用程序启动时将消息从 Redis(如果有)读取到通道。但我对这种方法并不满意。

【问题讨论】:

    标签: spring redis spring-integration


    【解决方案1】:

    QueueChannel 的端点的Poller 可以使用TransactionSynchronizationFactory 进行配置,其中DefaultTransactionSynchronizationFactory 实现可以配置为通过ExpressionEvaluatingTransactionSynchronizationProcessor 将消息重新发送回队列:https://docs.spring.io/spring-integration/docs/5.0.3.RELEASE/reference/html/transactions.html#transaction-synchronization

    【讨论】:

    • 我已经看到了,但我什至没有测试它,因为它似乎不适用于我的情况。当消息传递到 ServiceActivator 时,它不再位于 RedisChannelMessageStore 上。然后,如果应用程序在处理消息时被杀死,我什至没有机会再次将其放在 MessageStore 上(考虑到我会在“processAfterRollback”上编写一些代码以在回滚的情况下再次将消息放在 MessageStore 上) .如果我错了,请纠正我。
    • 是的...我同意你的看法。需要多想。虽然到目前为止您对自定义解决方案的想法是有道理的
    • 我用enableTransactionSupport 尝试了RedisTemplate,但看起来任何读取操作都不能在事务中使用。即使 Redis 列表大小 > 0,单独 TX 中的 BRPOP 仍会为我返回 null... 所以,您赢得的解决方案听起来不错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多