2

我有一个使用反应器进行异步任务的 Spring Boot 项目。我已经开始将项目升级到 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 的事件总线现在叫什么名字呢?当我尝试仅使用 value 属性的 @Selector 时,我开始获得 NPE。

4

3 回答 3

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;
  }

但有关字段名称的相同规则适用。我倾向于更喜欢构造函数注入而不是注入字段。

于 2017-01-08T16:23:04.170 回答
0

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

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

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

}

于 2016-02-16T14:00:52.183 回答
0

在从 Reactor v1.x 迁移到 Reactor v2.x 时,Reactor被重命名为在注释EventBus反映出来@Selector

@Selector从..

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

至..

@Selector(value = "someEvent", eventBus = "@rootReactor")
于 2016-06-28T22:17:03.517 回答