Spring 事件发布者不等待侦听器

问题描述 投票:0回答:1

我有 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版本之后,就等不及了

这是预期的输出顺序:

  • 发布前
  • 事件监听器的启动
  • 事件监听器结束
  • 发布后
  • 发布方法结束

是否存在错误或者这是应用程序侦听器的正确工作方式?我该怎么做才能实现这一目标?

java spring event-listener
1个回答
0
投票

查看 ApplicationEventPublisher.html 文档。 [https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ApplicationEventPublisher.html#publishEvent(java.lang.Object)][1]

这样的事件发布步骤实际上是向多播器的移交,并不意味着同步/异步执行,甚至根本不意味着立即执行。鼓励事件侦听器尽可能高效,单独使用异步执行来进行长时间运行和可能阻塞的操作。

© www.soinside.com 2019 - 2024. All rights reserved.