JMS和Spring批处理

问题描述 投票:8回答:1

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

我是JMS和春季批次的新手。我有几个基本问​​题要问:

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

高级设计图低于enter image description here

java spring-batch publish-subscribe spring-jms point-to-point
1个回答
1
投票

PTP vs Pub / sub

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

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

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

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

CLIENT_ACKNOWLEDGE - 使用此选项,客户端通过调用消息的确认方法来确认消息。确认已消耗的消息会自动确认收到其会话已传递的所有消息。

简单地说,关于批量交付的答案是“如果JMS提供商支持它,那么是,否则没有”

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

以下是Oracles的界面:

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

CLIENT_ACKNOWLEDGE的组合。 +在a上调用方法acknowledgeUpThroughThisMessage。消息将确认到那时为止收到的所有消息。

手动确认消息:

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

void acknowledge()throws JMSException确认此消耗消息的会话的所有消耗消息。当客户端指定要明确确认其JMS会话的消耗消息时,所有使用的JMS消息都支持确认方法。通过对消费的消息调用确认,客户端确认消息被传递到的会话所消耗的所有消息。

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

客户端可以在消费时单独确认每条消息,或者可以选择将消息确认为应用程序定义的组(通过在组的最后接收的消息上调用确认来完成,从而确认会话消耗的所有消息。 )

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

© www.soinside.com 2019 - 2024. All rights reserved.