Mono<Void>的doOnNext未触发,如何实现成功日志且不修改返回类型?
问题原因
你的代码里使用doOnNext来记录日志,但eventPublisherService.publish()返回的是Mono<Void>类型。Mono<Void>的特性是不会发射任何数据元素,只会发出完成信号,而doOnNext是在元素被发射时才会执行的操作,所以日志永远不会被触发。
解决方案
把doOnNext替换为doOnSuccess——这个操作会在Mono成功完成时触发,无论它是否发射了元素,正好适配Mono<Void>的场景。修改后的代码如下:
private Mono<Void> sendEvent(EventType eventType, Bundle bundle, String tenantId) { EventAbstractFactory<AbstractHealthDataEvent> factory = this.eventFactory.getFactory(eventType, bundle, tenantId); Optional<AbstractHealthDataEvent> eventOptional = factory.createEvent(); if (eventOptional.isPresent()) { return eventPublisherService.publish(eventType, eventOptional.get()) .doOnSuccess(aVoid -> LOGGER.info("{} event published successfully.", eventType.getName())); } return Mono.empty(); }
补充说明
如果需要在Mono完成(无论成功还是失败)时执行操作,可以使用doOnTerminate,但你的需求是成功后记录日志,所以doOnSuccess是最精准的选择。
内容的提问来源于stack exchange,提问作者Jonathan Hagen
相关产品推荐
相关产品推荐

