我有一个Spring Cloud Stream应用,可以使用RabbitMQ从Rabbit 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
基本相同的功能:
答案 0 :(得分:1)
这里有几个问题。
@StreamListener
方法只调用一次,只是为了设置Flux
所以@Transactional
对该方法毫无意义 - 然后消息会流经通量,因此任何与个人有关的事情消息必须在流量的上下文中完成。是的,你需要使用手册;大概就是mongodb商店运营的结果。您可能需要使用Flux<Message<Event>>
,这样您才能访问频道和投放标记标题。