Activemq Spring批处理JMSItemReader在会话事务处理模式下提供重复数据

Activemq Spring批处理JMSItemReader在会话事务处理模式下提供重复数据,activemq,spring-batch,spring-transactions,spring-jms,Activemq,Spring Batch,Spring Transactions,Spring Jms,我有一个spring批处理作业,它只有一个步骤。我正在使用JMSItemReader,其中jmstemplate是会话事务,而我的编写器只是执行一些业务逻辑。当默认情况下出现任何异常并且重试已用尽时,批处理大小将自动变为1,并逐个重试所有项目 我正在定义这样的步骤 stepBuilderFactory.get("step") .<String, String> chunk(10) .reader(reader())

我有一个spring批处理作业,它只有一个步骤。我正在使用JMSItemReader,其中jmstemplate是会话事务,而我的编写器只是执行一些业务逻辑。当默认情况下出现任何异常并且重试已用尽时,批处理大小将自动变为1,并逐个重试所有项目

我正在定义这样的步骤

stepBuilderFactory.get("step")
                .<String, String> chunk(10)
                .reader(reader())
                .processor(processor)
                .writer(writer)
                .faultTolerant()
                .processorNonTransactional()
                .retry(SomeException.class)
                .retryLimit(2)
                .backOffPolicy(backOffPolicy)
                .skip(SomeException.class)
                .skipLimit(Integer.MAX_VALUE)
                .build();
stepBuilderFactory.get(“步骤”)
. 区块(10)
.reader(reader())
.处理器(处理器)
.作者(作者)
.容错()
.processorNonTransactional()
.retry(SomeException.class)
.再犯限制(2)
.退保政策(退保政策)
.skip(SomeException.class)
.skipLimit(整数.MAX_值)
.build();
我面临的问题是这样的 输入是:1,2,3,4,5,6,7,8,9,10

  • 第1、2、3、4、5批中的项目
  • 写入程序中发生异常
  • 重复2次,重复到筋疲力尽
  • 现在它将像这样逐个尝试

    第1项-错误

    项目-2-成功

    第3项-错误

    第4项-错误

    项目-5-成功

  • 由于出现错误,因此跳过项目1、3、4,并成功处理项目2、5

  • 这是一个问题-接下来我应该得到6,7,8,9,10作为批处理,但我得到1,2,3,4,5作为批处理,它得到了不稳定的执行
  • 注意:当sessionTransact为false时,它可以正常工作,但在这种情况下,如果ActiveMQ队列出现异常,它不会回滚消息。


    非常感谢您的帮助。

    我认为这是一种有效的行为,因为存在事务回滚,并且消息未从队列中删除,所以消息可供下一个侦听器线程读取。并且您跳过了Integer.MAX_值的限制,因此它将无限期地重试(几乎和您有大的skiplimit一样)。我认为您需要为正在读取的队列配置死信队列,以便在某些重试之后,如果消息已损坏/无效,应将其移动到
    DLQ
    ,以便手动干预以处理消息。因此,相同的消息不会再次发送给侦听器。

    您能告诉我如何使用java配置在客户端设置DLQ吗?您需要在服务器端而不是客户端进行配置,在客户端唯一可以配置的是TimeToLive,这在您的实现中不是这样的,因为您想删除无效的消息。以下是服务器端的配置。