@EventListener具有非 void 返回值的批注方法不会触发新事件



我有以下方法,我试图返回一个 none void 类型,并希望通过相同的方法(递归(处理已发布的事件。

@EventListener
@Async
public GenericSpringEvent<?> onGenericEvent(GenericSpringEvent<?> event) throws InterruptedException {
Thread.sleep(5000);
System.out.println("Received spring generic event - " + event.getWhat() + ", thread id " + Thread.currentThread().getId());
return new GenericSpringEvent<String>(String.valueOf(System.currentTimeMillis()), true);
}

该方法最初是由我的应用程序中的以下调用触发的:

GenericSpringEvent<String> genericSpringEvent = new GenericSpringEvent<>("GENERIC - STRING - TRUE", true);
applicationEventPublisher.publishEvent(genericSpringEvent);

侦听器只被调用一次。我期待一个无休止的循环。有人可以解释我如何实现它。不过,它不一定是相同的侦听器方法,我想了解这种非无效返回功能的工作原理。谢谢!

您只发布一次 GenericSpringEvent! 这就是原因。为了再次发布它,我看到了两个选项:

1 - 你必须做同样的事情:在你的onGenericEvent方法中applicationEventPublisher.publishEvent(genericSpringEvent);

2 - 围绕你的 onGenericEvent 方法编写一些方面,以便在返回后执行applicationEventPublisher.publishEvent(returnedGenericSpringEvent);

返回事件不会使其发布,用 @EventListener 注释的方法就像任何其他方法一样,因此这就是为什么它可能具有非 void 返回的原因。

它以这种方式工作

@Async
@EventListener
public CompletableFuture<ResponseDTO> generateXml(RequestDTO requestDTO) {
    Thread.sleep(5000);
    logger.debug("First step completed");
    return CompletableFuture.supplyAsync(() -> ResponseDTO.builder()
            .build());
}
@Async
@EventListener
public void sendXml(ResponseDTO responseDTO) {
    logger.debug("Second step completed");
}

享受

最新更新