Невозможно использовать несколько экземпляров обработчика событий Spring - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь познакомиться со слушателем весенних событий в java, и я сталкиваюсь со странным поведением. У меня есть класс издателя и класс слушателя, и я пытаюсь использовать несколько экземпляров одного и того же класса слушателя (не знаю, возможно ли это). Вот мой код:

public class TestClass {

    public static void main(String[] args) throws Exception {
        testEvents();
    }

    private static void testEvents() throws InterruptedException {
        AnnotationConfigApplicationContext eventPublisherContext = new AnnotationConfigApplicationContext(EventListenerConfig.class);
        CustomSpringEventPublisher eventPublisher = eventPublisherContext.getBean(CustomSpringEventPublisher.class);
        List<CustomSpringEventListener> listenersList = new ArrayList<CustomSpringEventListener>();

        for (int i = 0; i < 5; i++) {
            listenersList.add(i, new CustomSpringEventListener());
        }

        for (int i = 0; i < 10; i++) {
            Thread.sleep(5000);

            LocalDateTime now  = LocalDateTime.now();
            eventPublisher.doStuffAndPublishAnEvent("new event " + now.format(Formats.isolong));
        }
    }
}

Мой класс слушателя выглядит так:

@Component
public class CustomSpringEventListener implements ApplicationListener<CustomSpringEvent> {

    @Override
    public void onApplicationEvent(CustomSpringEvent event) {
        System.out.println("Received spring custom event - " + event.getMessage());
    }

}

Мой класс издателя выглядит так:

@Component
public class CustomSpringEventPublisher {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void doStuffAndPublishAnEvent(final String message) {
        System.out.println("Publishing custom event --> " + message);
        this.applicationEventPublisher.publishEvent(new CustomSpringEvent(this, message));
    }

}

Мой класс конфигурации выглядит вот так:

@Configuration
@ComponentScan({"some.local.directory"})
public class EventListenerConfig {
}

Я ожидаю, что вывод этого кода будет один отпечаток для publi sh, за которым следуют 5 отпечатков получения. Однако фактический вывод:

Publishing custom event --> new event 2020-02-17T08:07:03.349
Received spring custom event - new event 2020-02-17T08:07:03.349
Publishing custom event --> new event 2020-02-17T08:07:08.389
Received spring custom event - new event 2020-02-17T08:07:08.389
Publishing custom event --> new event 2020-02-17T08:07:13.403
Received spring custom event - new event 2020-02-17T08:07:13.403

Кажется, что for l oop, в котором я добавляю новые экземпляры того же слушателя в список, игнорируется. Почему это происходит? Можно ли даже сделать несколько экземпляров одного и того же слушателя и получить от них опубликованное событие? Как я могу изменить свой код, чтобы он работал? Что произойдет, если я попытаюсь создать экземпляр одного и того же слушателя в нескольких потоках, работающих вместе, будет ли только один из них отвечать на событие? Спасибо за любую помощь, спасибо.

...