ApplicationEventPublisher

ApplicationEventPublisher

我正在尝试构建DiscoveryClient,并且当路由发生更改时,我希望它引发事件。我在用

publisher.publishEvent(new InstanceRegisteredEvent<>(this, "serviceName"));


但是,即使该事件是同一对象,也不会真正触发该事件。我怀疑这是因为它是一个不同的线程,但是@Scheduled也从另一个线程运行,并且成功触发。

最佳答案

我遇到的情况是我正在使用应用程序的BootstrapAutoConfiguration阶段提供的ApplicationEventPublisher。因为我正在使用它,所以我发布的事件不会按预期传播。

为了解决这个问题,我必须确保通过添加另一个在AutoConfiguration阶段而不是Bootstrap阶段执行的AutoConfiguration来更改引导过程中放入的ApplicationEventPublisher。

在我的情况下,我在类中添加了(但它是可选的)ApplicationEventPublisherAware DockerSwarmDiscovery

@Configuration
@ConditionalOnBean(DockerSwarmDiscovery.class)
@Slf4j
public class DockerSwarmDiscoveryWatchAutoConfiguration {

    @Autowired
    private DockerSwarmDiscovery dockerSwarmDiscovery;

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    @PostConstruct
    public void injectPublisher() {
        dockerSwarmDiscovery.setApplicationEventPublisher(applicationEventPublisher);
    }

}

10-08 17:27