Spring,Reactor和@Consumer

时间:2016-01-11 16:01:20

标签: spring spring-boot project-reactor

我有一个Spring Boot项目,它使用reactor来执行异步任务。我已经开始将项目升级到Spring Boot 1.3.1。作为副作用,似乎它正在使用新版本的反应堆。我试图弄清楚如何让它与新的反应堆一起工作。我正在使用@Consumer和@Selector注释来告诉它为这样的事件使用哪些类和方法:

@Consumer
public class MyReceiver {

  @Selector(value = "someEvent", reactor = "@rootReactor")
  public void receiveEvent(SomeObject someObject) {
    ...
  }

}

我之前通过在服务类中执行此操作来通知接收方:

@Autowired
Reactor rootReactor;

public void someMethod() {
  ...
  rootReactor.notify("someEvent", Event.wrap(someObject));
}

我已经发现我需要将rootReactor的内容更改为:

@Autowired
EventBus eventBus;

public void someMethod() {
  ...
  eventBus.notify("someEvent", Event.wrap(someObject));
}

但我不确定我需要在消费者方面做些什么。 @Selector不再支持reactor属性,因此您可以将其更改为eventBus,但现在命名的detault事件总线是什么?当我只使用值属性尝试@Selector时,我开始获得NPE。

3 个答案:

答案 0 :(得分:1)

我刚用reactor-spring-messaging 2.0.7.RELEASE尝试了这个,即使autowired字段是私有的,它也能正常工作。该字段确实必须完全命名" eventBus"或者,如果您将其他名称命名,则必须在@Selector注释中指定其替代名称。

如果您愿意,可以@Autowire或@Inject EventBus到您的构造函数并分配属性。这样可以正常工作,并且具有以下优点:IDE不会因为声明其他未使用的字段而生气::

  private final EventBus eventBus;

  @Autowired
  private SomeObject(EventBus eventBus) {
    this.eventBus = eventBus;
  }

但适用与字段名称相同的规则。我更倾向于在注入的场上注入构造函数。

答案 1 :(得分:0)

您的消费者必须定义eventBus类型的自动装配的公共(!)属性。消费者扫描并注册到总线。不是一个非常好的解决方案,但它应该工作

@Consumer
public class MyReceiver {
   @Autowired
   public EventBus eventBus;

   @Selector(value = "someEvent", reactor = "@rootReactor")
   public void receiveEvent(SomeObject someObject) {
       ...
   }
}

}

答案 2 :(得分:0)

从Reactor v1.x迁移到Reactor v2.x时,Reactor已重命名为EventBus reflected in the @Selector annotation

您的@Selector来自..

@Selector(value = "someEvent", reactor = "@rootReactor")

要..

@Selector(value = "someEvent", eventBus = "@rootReactor")