【问题标题】:WebFlux - ignore 'cancel' signalWebFlux - 忽略“取消”信号
【发布时间】: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&lt;T&gt; 并直接覆盖:

@Override
public void cancel() {
    System.out.println("Cancelled / ignored");
}

但这看起来更像是黑客攻击。

总结一下

有人可以建议,运行一些反应性管道的“正确”方式是什么,通过控制器触发,可以忽略取消信号?

【问题讨论】:

  • 为什么要忽略这个?反应式管道应该只在订阅者仍在收听 rt 时发出?如果订阅者不感兴趣,你还想发出吗?
  • @vins - 公平的问题,谢谢;背后的逻辑是,一旦客户端唤起给定的动作-它“必须运行”,而不管客户端是否取消;假设调用启动了一些无法回滚/还原的进程,并且客户端超时,但仍然可以通过不同的操作获得此类操作的“结果”;我知道我们可以考虑不同的模式,但我只是对特定情况感到好奇——忽略“取消”信号

标签: reactive-programming spring-webflux project-reactor


【解决方案1】:

当前的 webflux 行为是完美的。但是,您的要求似乎有所不同,即使订阅者不再对收听数据感兴趣,您也总是希望发出。在这种情况下,只需将源设为 HOT。

@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"))
                .cache(); // hot source
    }
}

【讨论】:

  • thx,看起来很有希望——事实上,在我的上下文中,.cache(0) 应该可以正常工作;然而,我很好奇——为什么这种方法比覆盖cancel()“更好”?您能分享一下您对此的看法吗?
  • 您也可以实现自己的处理器。但这似乎是不必要的。您负责所有测试以确保其正常工作并且不会导致任何其他问题。 Reactor 建议使用现有的。 projectreactor.io/docs/core/release/reference/#processors
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 2011-09-29
  • 2014-08-20
  • 1970-01-01
相关资源
最近更新 更多