You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 10:34:58