Есть ли способ контролировать порядок развертывания классов в wildfly? - PullRequest
1 голос
/ 18 июня 2020

Эта служба опроса используется как библиотека (файл jar).

@ApplicationScoped
public class PollingService {

@Inject
protected MessageConsumer consumer;

protected void init(@Observes @Initialized(ApplicationScoped.class) Object o) {
    final Set<String> subscribers = consumer.getSubscribers();
    //for each subscribers there's some task to execute.}}

В то время как подписчик добавляется другим классом области приложения из другого проекта.

@ApplicationScoped
public class MessageListener {
private static final Logger logger = LoggerFactory.getLogger(MessageListener.class);
private static final String TEST_QUEUE = "V3-shankar-test";

@Inject
private MessageConsumer consumer;

public void postConstruct(@Observes @Initialized(ApplicationScoped.class) Object o) {
    consumer.subscribe(TEST_QUEUE);
}

Есть ли какие-либо способ инициализации класса Pollingservice после добавления подписчика классом MessageListener?

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

В CDI нет механизмов, которые позволяли бы упорядочивать инициализацию bean-компонентов в той же области (@ApplicationScoped в приведенном выше примере).

CDI предоставляет другие возможности для использования:

  1. @Inject @Any Instance<>
  2. запускается в зависимости от приложения c событий

Пример кода с Instance:

@ApplicationScoped
public class PollingService {

    @Inject
    @Any
    protected Instance<MessageListener> listeners;

    protected void init(@Observes @Initialized(ApplicationScoped.class) Object o) {
        for (MessageListener listener : listeners) {
            //for each subscribers there's some task to execute.
        }
    }

}

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

Пример кода со специфичными для приложения c событиями:

public class PollingServiceInit {
    private final PollingService service;
    ...

    public void subscribe(MessageConsumer consumer) {
        service.subscribe(consumer);
    }
}

@ApplicationScoped
public class PollingService {

    @Inject
    private Event<PollingServiceInit> event;

    protected void init(@Observes @Initialized(ApplicationScoped.class) Object o) {
        event.fire(new PollingServiceInit(this));
    }

    void subscribe(MessageListener listener) {
        //for each subscribers there's some task to execute.
    }

}

@ApplicationScoped
public class MessageListener {
    void onPollingServiceInit(@Observes final PollingServiceInit event) {
        event.subscribe(this);
    }
}
0 голосов
/ 18 июня 2020

Вы можете поместить @Priority в параметр o в каждом из ваших примеров. Обычно значение его элемента с типом int - это что-то, отрисованное или увеличенное из констант класса javax.interceptor.Priority. Спецификация содержит некоторые детали в уведомлении метода наблюдателя.

...