当前位置: 首页 > 知识库问答 >
问题:

WebFlux-忽略“取消”信号

芮明知
2023-03-14

试图从其他人那里得到答案

假设我有一个简单的控制器,如下所示:

@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\u ignore\u client\u abort on实现这一点 但这不能正常工作。

我可以。订阅(...)到自定义订阅者,例如忽略取消信号,但比我看到的处理执行了两次-这是非常明显的,没有预料到。

另一个选择是,我可以扩展流量

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

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

有人能告诉我,什么是通过控制器触发的、可以忽略取消信号的反应管道的“正确”运行方式吗?


共有1个答案

唐阳晖
2023-03-14

当前的webflux行为是完美的。然而,您的要求似乎有所不同,即使订户不再对监听数据感兴趣,您也总是希望发出这种信息。在这种情况下,只需加热电源即可。

@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
    }
}
 类似资料:
  • 我正在为多人游戏实现简单的网络服务器。我只是想搞清楚Netty 我通过telnet测试服务器。我所做的是向所有频道广播信息。工作很顺利。此外,我从地图上删除通道关闭事件,这是罚款。 但问题是,如果其中一个客户端意外断开连接,则在关闭回调之前,MessageRec的回调调用其发送方断开连接的信道。 如何正确忽略来自断开连接的客户端的消息?我在中使用,但用于也不是正确的字符串。在断开连接的通道结束时,

  • 问题内容: 我有一个正在建立的用于访问Web服务的客户端。我正在使用一些JAXB生成的类(Netbeans 6.9)来解组我的xml数据。 尝试从此Web服务解组InputStream响应时遇到意外元素错误,如果将响应保存到文件中,也会遇到相同的意外元素错误。 将数据保存到文件后,我可以进入并删除SOAP标签(信封,正文,标题),然后毫无问题地进行解组。 我还没有真正找到一种使拆封忽略这些标签的方

  • 问题内容: 我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。 我在代码的2个不同位置使用JSON序列化: 在REST API的响应中。 当代码与Elasticsearch交互时。 我在Elasticsearch中需要一些属性,但我想向应用程序用户隐藏(例如,来自关系数据库的内部ID)。 这是一个实体的例子: 问题 :当对象持久化在Elasticsearc

  • 问题内容: 我在代码中的不同业务用例之间共享的大型模型(超过50个字段)上使用了MapStruct。根据入口点的不同,某些属性将被映射,而某些属性将不被映射。构建项目时,我将始终收到“警告:未映射的目标属性”消息。 我研究发现,可以通过使用语义告诉mapstruct忽略字段 问题是,考虑到我的对象具有如此多的字段,将需要大量代码来忽略每个映射器类中的每个单个属性。我也不希望此警告出现在我的日志中。

  • 问题内容: 这是取消任务的示例: 正常,任务已取消。如果陷在任务中不会被取消: 可能很容易忘记我不应该在异步代码内(例如,可以是第三方代码)禁止任何地方的异常,但是 应该 取消任务。反正我能做到吗?还是被忽略意味着任务根本无法取消? 问题答案: 您无法取消抑制的任务。这类似于无法关闭忽略的生成器。 这是故意行为。任务可能要在取消上做一些额外的工作(例如,资源清理),因此捕获可能是个好主意,但抑制通

  • 我使用intern.js和硒网格来测试我的应用程序web,当我在节点机器(MAC)上运行Chrome测试时,我得到这个错误: 您正在使用不支持的命令行标志-忽略-证书-错误稳定性和安全性将受到影响