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

Spring Cloud Gateway自定义过滤器:webclient.create().post()在测试时导致挂起

段干宜
2023-03-14

因此,我创建了一个自定义过滤器,当被访问时,它将创建一个webflux客户机并发送到预定的URL。这在运行时似乎很好,但在测试这段代码时,测试就挂起了(直到我取消测试)。因此,我觉得除了无法完成测试以确保此路由正常工作之外,还可能存在内存泄漏。如果我将WebClient方法切换为get(),那么筛选器的结果测试工作正常。带有post()的东西我不确定缺少什么。

@Component
class ProxyGatewayFilterFactory: AbstractGatewayFilterFactory<ProxyGatewayFilterFactory.Params>(Params::class.java) {
    override fun apply(params: Params): GatewayFilter {
        return OrderedGatewayFilter(
                GatewayFilter { exchange, chain ->
                    exchange.request.mutate().header("test","test1").build()
                    WebClient.create().post()
                            .uri(params.proxyBasePath)
                            .body(BodyInserters.fromDataBuffers(exchange.request.body))
                            .headers { it.addAll(exchange.request.headers) }
                            .exchange()
                            .flatMap {
                                println("the POST statusCode is "+it.statusCode())
                                Mono.just(it.statusCode().is2xxSuccessful)
                            }
                            .map {
                                exchange.request.mutate().header("test", "test2").build()
                                println("exchange request uri is " + exchange.request.uri)
                                println("exchange response statusCode is "+ exchange.response.statusCode)
                                exchange
                            }
                            .flatMap(chain::filter)
                }, params.order)
}

共有1个答案

欧阳绪
2023-03-14

摘自文档,如果使用exchange,您有义务使用正文。

与retrieve()不同,在使用exchange()时,应用程序负责使用任何响应内容,而不管场景如何(成功、错误、意外数据等)。不这样做会导致内存泄漏。用于ClientResponse的Javadoc列出了消费主体的所有可用选项。通常更喜欢使用retrieve(),除非您有充分的理由使用exchange(),它允许在决定如何或是否使用响应之前检查响应状态和头。

Spring framework 5.2.9 Webclient

这个api在spring framework 5.3.0的最新版本中已经改变,现在spring将强制您使用主体,因为开发人员实际上并没有阅读文档。

 类似资料:
  • 演示在网关追加一个header public class CustomFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 演示在网关追加heade

  • SOFARPC 提供了一套良好的可扩展性机制,为各个模块提供 SPI 的能力。 SOFARPC 对请求与响应的过滤链处理方式是通过多个过滤器 Filter 来进行具体的拦截处理,该部分可由用户自定义 Filter 扩展,自定义 Filter 的执行顺序在内置 Filter 之后。具体方式如下: Bolt Filter 新建自定义 Filter 。 public class CustomFilter

  • 问题内容: 我试图在Log4J2中实现和配置自定义过滤器- 基于ThresholdFilter,但打算做更多。我已经看到了有关自定义追加程序的主题,这些主题遵循相同的插件注释语法,但是还没有找到有关自定义拟合程序的主题。 MyCustomFilter.java (基于ThresholdFilter) log4j2.xml LoggingRunner.java 配置语法似乎与Apache文档中的语法

  • 本文向大家介绍Django 自定义过滤器,包括了Django 自定义过滤器的使用技巧和注意事项,需要的朋友参考一下 示例 过滤器允许您将函数应用于变量。此函数可以使用0或1参数。语法如下: 过滤器可以链接在一起,因此非常有效: 如果将其翻译成python,上面的代码行将给出以下内容: 在此示例中,我们将编写一个verbose_name适用于模型(实例或类)或QuerySet的自定义过滤器。它将返回

  • Dorado支持在Client或Server端创建自定义的过滤器并指定过滤器的优先级生成过滤器链路。 Dorado支持全局生效的Filter和单个配置生效的Filter,具体使用方式见下面说明。 1.过滤器接口定义 package com.meituan.dorado.rpc.handler.filter; /** * 过滤器接口, 可自行实现 * * 全局生效Filter,通过SPI配置

  • 本文向大家介绍vue自定义filters过滤器,包括了vue自定义filters过滤器的使用技巧和注意事项,需要的朋友参考一下 官方给出 详情查看 在项目中我们如果有多个filters,那么我怎么一次注册,全局可用,我们在项目里新建一个filters文件夹,如下,index.js是出口文件,readMore是一个对字符串做处理的过滤器 文件目录 下面贴上代码: 然后在main.js里面做如下处理: