使用 Webflux 时返回后在后台发出 http 请求?

Making http request in the background after return when using Webflux?

提问人:Ang Alex Li 提问时间:11/16/2023 最后编辑:Ang Alex Li 更新时间:11/16/2023 访问量:30

问:

我正在尝试处理webflux中的错误,处理包括根据上游的错误消息发送http请求以获取错误的相关信息,然后使用请求结果在db中操作。

这种错误处理需要花费大量时间,并且与我的响应无关,因此我想立即返回上游结果并在后台运行错误处理过程。

我尝试过以下代码

return MyProcess()
       .doOnSuccess(response -> logSuccess())
       .doOnError(e-> Mono.fromCallable(()->apnsCallback.handleIOSError(e.getMessage()))
                          .subscribeOn(Schedulers.boundedElastic())
                          .subscribe());

它立即返回结果,并在后台触发,看起来不错,但问题是只执行了我的 http 请求之前的代码。MyProcess()handleError()

我已经阅读了这个答案并尝试了,所有代码都已执行,但我的服务在错误处理完成之前不会返回。onErrorResumehandleError()

无论如何,我都可以使用 webflux 在后台发出 http 请求吗?

java spring-webflux 反应式编程

评论

0赞 Toerktumlare 11/16/2023
首先,我需要问你的代码中有一些奇怪的事情,subscribOn 在订阅时应用,publish on 在代码命中 publishOn 时应用。你添加的两个调度器都会使你的代码成为“非反应式”,所以你能不能激励你为什么有意需要这些,因为通常你使用一个或另一个,而且你只在非常特殊的情况下将你的代码变成非反应式。其次,为什么在反应式中添加的是调用者(客户端,例如网页)是订阅者。那么,您为什么要订阅自己的应用程序。subscribe
0赞 Ang Alex Li 11/16/2023
@Toerktumlare 1.对于我试图在另一个测试中切换线程,却忘记将其删除。你是对的,当有.2. 我参考了这个答案,实际上触发了 errorHandler(至少是执行 http 请求之前的代码),如果 Mono.fromCallable() 不以 subscribe() 结尾,则错误处理程序不会发生任何事情。publishOnsubscribeOnsubscribe
0赞 Martin Tarjányi 11/18/2023
你的方法对我来说看起来不错,我不明白你面临的问题。“只有我的http请求执行之前的代码”是什么意思?究竟是哪一部分?也许你应该分享一下是什么样子的?如果它返回 ,则应使用 而不是 .handleIOSErrorMonodeferfromCallable
0赞 Ang Alex Li 11/21/2023
在尝试了@MartinTarjányi的解决方案后,我解决了这个问题。当我使用 webclient 进行 http 调用时,它将返回一个,并且由于它在订阅时间之前创建得太早,因此它将在返回的范围之外执行。handleErrorMonoMono

答: 暂无答案