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

Spring boot+WebFlux:并行运行某些步骤时上下文丢失

轩辕远
2023-03-14

Spring Boot:2.1.3.释放

你们好,

    null
public class TestFilter implements WebFilter {

    private Logger LOG = LoggerFactory.getLogger(TestFilter.class);

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        return chain.filter(exchange)
            .doOnEach(voidSignal -> System.out.println("filter:"+voidSignal.getContext().getOrEmpty("blob"))).subscriberContext(Context.of("blob", "kapoue"));
    }

}
    null
java prettyprint-override">@RestController
@RequestMapping(TestControllerWebFlux.ROOT)
public class TestControllerWebFlux {

    static final String ROOT = "/flux";
    static final String TEST = "/test";

    private WebClient webClient = WebClient.create();

    @GetMapping(
            value = TEST,
            produces = {MediaType.APPLICATION_JSON_VALUE})
    public Mono<String> test() {
        System.out.println("controller1:"+Thread.currentThread());

        Flux<String> call = webClient.get().uri("http://localhost:" + 8080 + ROOT + "/test2").retrieve().bodyToFlux(Result.class).map(Result::getValue);

        return call.map(s -> s+"0")
            .doOnEach(stringSignal -> System.out.println("controller2:"+stringSignal.getContext().getOrEmpty("blob")))
            .parallel()
            .doOnEach(stringSignal -> System.out.println("controller3:"+stringSignal.getContext().getOrEmpty("blob")))
            .map(s -> s+"0")
            .doOnEach(stringSignal -> System.out.println("controller4:"+stringSignal.getContext().getOrEmpty("blob")))
            .reduce((s, s2) -> s+s2)
            .doOnEach(stringSignal -> System.out.println("controller5:"+stringSignal.getContext().getOrEmpty("blob")))
            .map(s -> {
                System.out.println("controller6:"+Thread.currentThread());
                return s;
            });
    }

    @GetMapping(
        value = "test2",
        produces = {MediaType.APPLICATION_JSON_VALUE})
    public Flux<Result> test2() {
        return Flux.just(new Result("0"), new Result("0"), new Result("0"));
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Result {
        private String value;
    }
}

这是一个bug,还是我不应该在像这样的调用后尝试并行运行?

提前感谢你的帮助。

共有1个答案

宦正诚
2023-03-14

这看起来像是Reactor里的窃听器。我报告了:https://github.com/reactor/reactor-core/issues/1656

 类似资料:
  • 本文向大家介绍jboss( WildFly)上运行 springboot程序的步骤详解,包括了jboss( WildFly)上运行 springboot程序的步骤详解的使用技巧和注意事项,需要的朋友参考一下 WildFly,原名 JBoss AS(JBoss Application Server) 或者 JBoss,是一套应用程序服务器,属于开源的企业级 Java 中间件软件,用于实现基于 SOA

  • 我已经在GitHub操作中设置了一个工作流来运行我的测试并创建测试覆盖的工件。我的YAML文件的精简版本如下所示: 问题是当测试失败时,工件不会被创建。 我从文档中找到了关于的条件,但这也会导致在我的步骤失败时运行此步骤。我不希望发生这种情况,因为在这种情况下没有什么可归档的。 如果上一步已经运行(成功或失败),我如何才能运行此步骤?

  • 完整的错误消息:JDK丢失,并且是运行某些NetBeans模块所必需的。请使用--jdkhome命令行选项指定JDK安装,或查看http://wiki.NetBeans.org/faqrunningonjre以获取更多信息。 一些细节:我刚刚第一次在Linux mint上安装Netbeans。当我启动它时,当它打开模块时,会出现这个错误消息。但我确实安装了jdk。 $Java-版本 $javac-

  • 本文向大家介绍Linux Docker运行springboot项目的步骤详解,包括了Linux Docker运行springboot项目的步骤详解的使用技巧和注意事项,需要的朋友参考一下 简介: Docker 运行springboot项目其实配置非常简单,跟咱们直接到Linux上运行springboot是一样一样的。开始 一:咱们首先要有一个运行Docker环境 第一步:使用 yum 安装(Cen

  • 我正在用spring WebClient对API进行并行rest调用。响应如下所示 POJOS: 获取产品 这也是有效的,但是有没有一种方法可以直接返回,或者返回更好? (下一步是将产品保存在数据库中)

  • 我试图使用新的SpringBoot2 Reactive WebClient类(它没有批处理endpoint)对同一个rest服务进行并行(批处理)调用。例如,我需要100个“comment”对象(ids为1...100),我正在执行以下并行调用: 我是Spring WebFlux的新手,我不确定这是否是用WebClient进行并行调用的正确方法 > 有没有更好(更合适)的方法来做这件事(即做一个单