Java JMS与Spring批处理

Java JMS与Spring批处理,java,spring-batch,publish-subscribe,spring-jms,point-to-point,Java,Spring Batch,Publish Subscribe,Spring Jms,Point To Point,我们的项目是集成两个应用程序,分别使用RESTAPI、JMS(提供异步特性)和spring batch从JMS队列读取批量数据并对其进行处理,然后将其发布到接收应用程序 我是JMS和SpringBatch的新手。我有几个基本问题要问: 要采用哪种JMS模型—(PTP或Pub/Sub) 可以从JMS队列中批量读取消息(使用JMSItemReader)。如果是,请任何人提供一个代码 我们希望在消息成功发布(即读过程写)到接收应用程序后,而不是在JMSItemReader读取消息时,将消息确认为“已

我们的项目是集成两个应用程序,分别使用RESTAPI、JMS(提供异步特性)和spring batch从JMS队列读取批量数据并对其进行处理,然后将其发布到接收应用程序

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

  • 要采用哪种JMS模型—(PTPPub/Sub
  • 可以从JMS队列中批量读取消息(使用JMSItemReader)。如果是,请任何人提供一个代码
  • 我们希望在消息成功发布(即读过程写)到接收应用程序后,而不是在JMSItemReader读取消息时,将消息确认为“已读”。我们如何才能做到这一点
下面是高层设计图

PTP与Pub/sub的对比

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

从理论上讲,如果需要在相同的数据块上执行多个函数,您可以通过这种方式将不同的处理器组织为订阅者来扩展应用程序,但这是一种非常高级的使用场景

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

这里的JMS规范只谈到(模糊地可能是误读)消息的批量确认,但它没有对消息的批量传递设置要求

客户端确认-使用此选项,客户端确认消息 通过调用消息的确认方法。确认已消费 消息自动确认接收到所有已发送的消息 已在本届会议上发言

简单地说,批量交付的答案是“如果JMS提供程序支持它,那么是,否则不是”

大多数提供程序都允许批量确认消息

以下是Oracles的界面:

public interface com.sun.messaging.jms.Message {
          void acknowledgeThisMessage() throws JMSException;
          void acknowledgeUpThroughThisMessage() throws JMSException;
}
客户确认的组合+在上通过此消息调用方法AcknowledgeUpthr。消息将及时确认截至该时刻收到的所有消息

手动确认消息:

这可以通过客户端确认和消息上的确认方法实现。在这里,我将再次引用acknowledge方法的javadoc,它也再次引用了您的第二个问题,它讨论了在一定程度上对所有消息的批量确认

无效确认() 抛出JMSException确认此已用消息会话的所有已用消息。所有已使用的JMS消息 支持确认方法,以便在客户端指定 它的JMS会话的已使用消息将被显式地 承认。通过对已使用的消息调用确认,客户端 确认会话使用的所有消息,该消息已被删除 送到

对于事务处理的会话和会话,对确认的调用都将被忽略 指定使用隐式确认模式的会话

客户可以在每条消息被消费时单独确认, 或者,它可以选择将消息确认为应用程序定义的消息 组(通过调用上次收到的 组的消息,从而确认组使用的所有消息 (会议结束。)

已接收但未确认的消息可能会被删除 重新交付


我可以回答关于最后一点的问题,对于作者,我们确实有听众,看看您是否能够在afterWrite事件中发回响应。为了获得进一步的帮助,我建议您阅读SpringBatch中的action,您还将在其中找到大量的示例,您还将找到与JMS相关的示例当出现问题时,您希望发生什么?我这样问是因为我想确认使用Spring批处理与Spring集成是这里的最佳选择…@Bilbo Thank将通过Spring批处理进行操作。@MichaelMinella我们使用Spring批处理以加快处理速度。我们希望批量读取数据,而不是从队列中逐个读取数据。Spring Batch提供了允许在单个事务中对消息进行批处理的
BatchMessageListenerContainer
。2.如果您正在寻找批处理手册,请查看我所撰写的Pro Spring批处理,以了解更多详细信息;)