我有 3 个课程,涉及 2 个不同的项目。我想从一个项目发布事件并等待另一项目上的侦听器方法结束。但就我而言,发布者方法并不等待听众。发布者方法结束后,监听器方法开始运行。
这是最小的、可重复的示例:
在项目 1 中,我有 2 个课程:
import org.springframework.context.ApplicationEvent;
public class ConfigEvent extends ApplicationEvent {
private static final long serialVersionUID = 144711L;
public ConfigEvent(Object source) {
super(source);
}
}
@Configuration
public class Config {
@Autowired
ApplicationEventPublisher publisher;
@Bean
public Object object(Object unnecessaryObject) {
System.out.println("Before publish");
publisher.publishEvent(new ConfigEvent(this));
System.out.println("After publish");
Object obj= new Object ();
System.out.println("End of publisher");
return obj;
}
}
在项目2中:
@Component
public class MyConfig implements ApplicationListener<ConfigEvent> {
@Override
public void onApplicationEvent(ConfigEvent event) {
System.out.println("Start of Event listener");
System.out.println("End of Event listener");
}
}
上面的情况输出顺序是这样的:
我的发布者方法正在等待听众。但改了spring版本之后,就等不及了
这是预期的输出顺序:
是否存在错误或者这是应用程序侦听器的正确工作方式?我该怎么做才能实现这一目标?
查看 ApplicationEventPublisher.html 文档。 [https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ApplicationEventPublisher.html#publishEvent(java.lang.Object)][1]
这样的事件发布步骤实际上是向多播器的移交,并不意味着同步/异步执行,甚至根本不意味着立即执行。鼓励事件侦听器尽可能高效,单独使用异步执行来进行长时间运行和可能阻塞的操作。