【发布时间】:2020-10-18 22:19:52
【问题描述】:
试图直接从 reactor 的文档和 spring webflux 文档中获得其他 SO q&a 的答案,但不知何故我仍然不确定如何实现这一点:(
假设我有如下简单的控制器:
@RestController
class DemoController {
@GetMapping("/demo/{text}")
public Flux<String> getDemo(@PathVariable String text) {
return Flux.fromArray(text.split(""))
.map(String::toUpperCase)
.delayElements(Duration.ofSeconds(1L))
.doOnNext(s -> System.out.println("S: " + s + " -> " + LocalDateTime.now().getSecond()))
.doOnCancel(() -> System.out.println("Cancelled"));
}
}
并且我希望处理忽略“取消”信号,这通常在客户端断开连接时出现。试图通过 nginx 的proxy_ignore_client_abort on; 实现这一点,但这不能正常工作。
我可以将.subscribe(...) 发送给自定义订阅者,例如忽略cancel 信号,但我看到处理执行了两次 - 这是非常明显的,没有预料到。
另一种选择是我可以 extends Flux<T> 并直接覆盖:
@Override
public void cancel() {
System.out.println("Cancelled / ignored");
}
但这看起来更像是黑客攻击。
总结一下
有人可以建议,运行一些反应性管道的“正确”方式是什么,通过控制器触发,可以忽略取消信号?
【问题讨论】:
-
为什么要忽略这个?反应式管道应该只在订阅者仍在收听 rt 时发出?如果订阅者不感兴趣,你还想发出吗?
-
@vins - 公平的问题,谢谢;背后的逻辑是,一旦客户端唤起给定的动作-它“必须运行”,而不管客户端是否取消;假设调用启动了一些无法回滚/还原的进程,并且客户端超时,但仍然可以通过不同的操作获得此类操作的“结果”;我知道我们可以考虑不同的模式,但我只是对特定情况感到好奇——忽略“取消”信号
标签: reactive-programming spring-webflux project-reactor