Rabbitmq Springboot RabbitListener在队列TTL后回滚

Rabbitmq Springboot RabbitListener在队列TTL后回滚,rabbitmq,spring-transactions,spring-amqp,spring-rabbit,Rabbitmq,Spring Transactions,Spring Amqp,Spring Rabbit,是否有某种方法可以将执行的事务回滚到RabbitListener事件中?我有下面这样的东西 @Autowired private SomeService service; @RabbitListener(queues = {"some-queue-ttl-5s"}) @Transactional public SomeOutputMessage handleMessageQueue(SomeInputMessage inputMessage){ //do somet

是否有某种方法可以将执行的事务回滚到RabbitListener事件中?我有下面这样的东西

@Autowired private SomeService service;

@RabbitListener(queues = {"some-queue-ttl-5s"})
@Transactional
public SomeOutputMessage handleMessageQueue(SomeInputMessage inputMessage){
    //do something
    return service.processInput(inputMessage); //JPA update transaction
} 

我尝试使用事务性,但即使在消息过期之后,
x-message-ttl
processInput也会提交事务。我想知道我们是否可以回滚进程并将inputMessage发送到DLX。

不清楚您在问什么;如果侦听器抛出异常,消息将被重新查询并重新传递(默认情况下)。消息过期与侦听器代码无关;这是为了使未传递的消息过期。我的问题是,我有一个异步生产者,它将发布到队列并等待5秒,在这个超时之后,侦听器不应该处理消息,让它进入DLX。所以我想知道我能在Listener中的TTL之后回滚事务,它仍然不清楚;只有当消息在队列中处于该时间段时,TTL才适用。如果它已经发送给消费者,那么您就倒霉了,您可以通过将
预回迁计数设置为1,一次只配置一条发送给消费者的消息。明白了。我知道这不是rabbitmq问题,但SpringBoot可能有某种机制来处理它,事实上,这就是问题所在。如果我能告诉spring boot不要处理那些在制作人方面会超时的消息,那与spring boot无关;TTL在消息发送给消费者之前由代理处理。您所能做的就是通过减少预回迁(在最极端的情况下为1)来最小化每个使用者的未完成消息。消息传递的全部目的是将生产者和消费者解耦。您可以让生产者添加一个包含时间戳
dontprocessaafter
的头,但生产者和消费者的时钟需要同步;然后,您可以丢弃消费应用程序中的过期邮件。