我有一个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。
答案 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")