Я пытаюсь познакомиться со слушателем весенних событий в 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, в котором я добавляю новые экземпляры того же слушателя в список, игнорируется. Почему это происходит? Можно ли даже сделать несколько экземпляров одного и того же слушателя и получить от них опубликованное событие? Как я могу изменить свой код, чтобы он работал? Что произойдет, если я попытаюсь создать экземпляр одного и того же слушателя в нескольких потоках, работающих вместе, будет ли только один из них отвечать на событие? Спасибо за любую помощь, спасибо.