Spring Cloud Stream with RabbitMQ binder,如何应用@Transactional?

时间:2018-06-11 08:48:53

标签: java spring-boot rabbitmq spring-data-mongodb spring-cloud-stream

我有一个Spring Cloud Stream应用,可以使用RabbitMQRabbit Binder接收活动。我的申请可以概括为:

@Transactional
@StreamListener(MySink.SINK_NAME)
public void processEvents(Flux<Event> events) {
       // Transform events and store them in MongoDB using 
       // spring-boot-data-mongodb-reactive
       ...
}

问题在于,@Transactional似乎不适用于Spring Cloud Stream(或者至少是我的印象),因为如果写入MongoDB时有异常事件似乎已经被ack:ed到RabbitMQ并且没有重试该操作。

鉴于我希望实现与使用spring-amqp的函数周围的@Transactional基本相同的功能:

  1. 使用Spring时,是否必须手动向RabbitMQ确认消息 使用Rabbit Binder的Cloud Stream?
  2. 如果是这样,我该如何实现?

1 个答案:

答案 0 :(得分:1)

这里有几个问题。

  1. 确认消息不需要交易
  2. 基于反应堆的@StreamListener方法只调用一次,只是为了设置Flux所以@Transactional对该方法毫无意义 - 然后消息会流经通量,因此任何与个人有关的事情消息必须在流量的上下文中完成。
  3. Spring Transactions绑定到线程 - Reactor是非阻塞的;该消息将在第一次切换时被激活。
  4. 是的,你需要使用手册;大概就是mongodb商店运营的结果。您可能需要使用Flux<Message<Event>>,这样您才能访问频道和投放标记标题。