JMS 和 Spring 批处理

Posted

技术标签:

【中文标题】JMS 和 Spring 批处理【英文标题】:JMS and Spring batch 【发布时间】:2016-01-04 17:03:19 【问题描述】:

我们的项目是集成两个应用程序,使用每个的rest api,使用JMS(提供异步性质)和spring批处理从JMS队列中读取批量数据并处理它,然后将其发布到接收应用程序。

我是 JMS 和 Spring Batch 的新手。我有几个基本问​​题要问:

哪个 JMS 模型领先 -(PTPPub/Sub) 可以从 JMS 队列中批量读取消息(使用 JMSItemReader)。如果是,任何人都可以提供代码。 我们希望在消息成功发布(即读取-处理-写入)到接收应用程序后确认消息为“已读”,而不是在 JMSItemReader 读取消息时确认。我们如何才能做到这一点?

高级设计图如下

【问题讨论】:

我可以回答最后一点,对于作家,我们确实有听众,看看你是否可以设法在 afterWrite 事件中发回响应。如需进一步帮助,我建议您阅读 Spring-batch in action,您还会在其中找到许多示例,您还将找到与 JMS 相关的示例 如果出现问题,您期望会发生什么?我问是因为我想确认使用 Spring Batch 与 Spring Integration 是这里的最佳选择...... @Bilbo 谢谢将通过春季批次的行动。 @MichaelMinella 我们正在使用弹簧批处理来加快处理速度。我们希望批量读取数据,而不是从队列中一个一个地读取数据。 需要注意两点: 1. Spring Batch 提供了BatchMessageListenerContainer,它允许在单个事务中对消息进行批处理。 2. 如果您正在寻找批处理书,请查看我是其作者的 Pro Spring Batch 以获取更多详细信息;) 【参考方案1】:

PTP 与 Pub/sub

使用消息队列的点对点方法是最标准的方法。尤其是在批处理应用程序中,我看不到使用发布订阅的直接理由,因为它假定您有多个相同消息的消费者。

理论上,如果需要在相同的数据块上执行多个功能,您可以将不同的处理器组织为订阅者,这样可以扩展应用程序,但这是非常高级的使用场景。

是否可以从 JMS 队列中批量读取消息:

这里的 JMS 规范只讨论(可能是误读了)消息的批量确认,但它没有对消息的批量传递设定要求。

CLIENT_ACKNOWLEDGE - 使用此选项,客户端确认消息 通过调用消息的确认方法。确认消费 消息自动确认收到的所有消息 已由其会议交付。

简单地说,关于批量交付的答案是“如果 JMS 提供者支持,则支持,否则不支持”

大多数提供商允许批量确认消息

这是执行此操作的 Oracle 界面:

public interface com.sun.messaging.jms.Message 
          void acknowledgeThisMessage() throws JMSException;
          void acknowledgeUpThroughThisMessage() throws JMSException;

CLIENT_ACKNOWLEDGE 的组合。 + 在 . message 将及时确认收到的所有消息。

手动确认消息:

这可以通过 CLIENT_ACKNOWLEDGE 和 Message 上的确认方法来实现。在这里,我将再次引用您的确认方法的 javadoc,该方法也再次引用了您的第二个问题,它谈到了对所有消息的批量确认。

无效确认() throws JMSException 确认此消费消息的会话的所有消费消息。所有消费的 JMS 消息 支持客户指定时使用的确认方法 其 JMS 会话的消费消息将被显式 承认。通过在消费消息上调用确认,客户端 确认会话使用的所有消息,该消息是 送到。

对于已交易的会话和 指定使用隐式确认模式的会话。

客户端可以在每条消息被消费时单独确认, 或者它可以选择将消息确认为应用程序定义的 组(这是通过在最后收到的调用确认 该组的消息,从而确认所有由该组消费的消息 会议。)

已收到但未确认的消息可能是 已重新发送。

【讨论】:

以上是关于JMS 和 Spring 批处理的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring JMS 进行错误处理的最佳实践

Spring整合JMS(消息中间件)

ActiveMQ / JMS 消息处理程序测试

如何使用 Spring JMS 发布 JMS 主题?

Spring整合Weblogic jms实战

JMS 队列上多线程消息处理的最佳实践