我有一个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事件总线是什么?当我仅使用value属性尝试@Selector时,我开始得到一个NPE。
发布于 2017-01-09 00:23:04
我刚刚用reactor-spring-messaging 2.0.7.RELEASE尝试了一下,即使自动连接的字段是私有的,它也能正常工作。该字段确实必须准确命名为"eventBus“,或者,如果您为其命名其他名称,则必须在@Selector注释中指定其替代名称。
如果你愿意,你可以@Autowire或者@Inject到你的构造函数中并分配一个属性。这种方式工作得很好,优点是IDE不会因为声明了一个未使用的字段而生气::
private final EventBus eventBus;
@Autowired
private SomeObject(EventBus eventBus) {
this.eventBus = eventBus;
}但是,关于字段名称的规则也同样适用。我倾向于更喜欢构造函数注入而不是注入字段。
发布于 2016-02-16 22:00:52
您的使用者必须定义一个自动连接的公共(!)eventBus类型的属性。消费者扫描并注册到总线上。这不是一个很好的解决方案,但它应该可以工作。
@Consumer
public class MyReceiver {
@Autowired
public EventBus eventBus;
@Selector(value = "someEvent", reactor = "@rootReactor")
public void receiveEvent(SomeObject someObject) {
...
}
}}
发布于 2016-06-29 06:17:04
在从Reactor v1.x迁移到Reactor v2.x的过程中,Reactor被重命名为EventBus,即reflected in the @Selector annotation。
你的@Selector是从..
@Selector(value = "someEvent", reactor = "@rootReactor")为了..。
@Selector(value = "someEvent", eventBus = "@rootReactor")https://stackoverflow.com/questions/34725913
复制相似问题