2016-01-11 6 views
2

У меня есть проект Spring Boot, который использует реактор для асинхронных задач. Я начал работу по обновлению проекта до Spring Boot 1.3.1. Как побочный эффект, похоже, что он использует новую версию реактора. Я пытаюсь выяснить, как заставить его работать с новым реактором. Я использую аннотации @Consumer и @Selector, чтобы сказать ему, какие классы и методы, чтобы использовать для события так:Весна, реактор и @Consumer

@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 больше не поддерживает атрибут реактора, поэтому вы можете изменить его на eventBus, но что теперь называется шиной аварийного события? Когда я попробовал @Selector с ТОЛЬКО атрибутом value, я начал получать NPE.

ответ

0

Ваш потребитель должен определить атрибут autwired, public (!) Типа eventBus. Потребитель сканирует его и регистрируется на автобусе. Не очень хорошее решение, но он должен работать

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

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

}

0

При переходе из реактора v1.x в реактор v2.x, Reactor был переименован в EventBus, который reflected in the @Selector annotation.

Ваш @Selector идет из ..

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

к ..

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

Я просто попытался это с 2.0.7.RELEASE реакторного пружинно-сообщениями и работает, даже если autowired поле является частной. Поле действительно должно быть названо точно «eventBus» или, если вы назовете его чем-то другим, вы должны указать его альтернативное имя в аннотации @Selector.

Если вы предпочитаете, вы можете @Autowire или @ Включить EventBus в свой конструктор и назначить свойство. Это прекрасно работает, и имеет то преимущество, что IDE не сердится на вас об объявлении иначе-неиспользуемое поле ::

private final EventBus eventBus; 

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

, но одни и те же правила об имени поля применить. Я предпочитаю инъекцию конструктора над введенными полями.

 Смежные вопросы

  • Нет связанных вопросов^_^