我有一个发送应用程序事件的类。接收者不能错过这个事件,因此发送者依赖于接收者。
@Service
@DependsOn("receiver")
class Sender {
...
@PostConstruct
public void init(){
applicationEventPublisher.publishEvent(new MyEvent());
}
}
@Service
class Receiver {
...
@EventListener
public void onEvent(MyEvent event) {
System.out.println("Event catched");
}
}
在调试模式下你可以看到Sender
之后初始化Receiver
,这应该会导致接收方始终捕获发送方的事件 - 但事实并非如此。
事实上,在初始化接收器和准备接收事件之间似乎存在延迟。如果我在发送方中延迟发布事件几毫秒,接收方就会按预期捕获它。
所以看起来像@DependsOn
并不能完全确保 Seceiver 在发送方之前完全初始化,这与记录的内容完全相反。
如何在不使用任何难看的延迟的情况下实现接收者捕获事件?
正如@M。 Deinum 建议,您面临的问题是应用程序上下文当时尚未准备好侦听事件。
触发的事件可以在 BeanFactoryPostProcessor(DefaultListableBeanFactory.preInstantiateSingletons() http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/support/DefaultListableBeanFactory.html) 完成的。您的 postConstruct 注释在 BeanFactoryPostProcessor 被调用之前被调用,这会导致事件处理的丢失。(参考spring bean 生命周期 https://stackoverflow.com/questions/21163355/spring-context-and-bean-lifecycle-callbacks-practical-examples-of-usage )
作为解决方案,您的 bean 可以在 applicationContext 启动时触发事件(上下文刷新事件 http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/beans.html#context-functionality-events)
@Service
class Sender {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@EventListener
public void applicationStarted(ContextRefreshedEvent event) {
applicationEventPublisher.publishEvent(new MyEvent());
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)