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

在多线程环境中正确使用Spring WebClient

秦才
2023-03-14

关于Spring WebClient我有一个问题

在我的应用程序中,我需要做许多类似的API调用,有时我需要更改调用中的头(身份验证令牌)。所以问题来了,在这两个选择中,什么更好:

>

  • 为所有传入的MyService.class请求创建一个WebClient,方法是将其设置为private final字段,如下代码所示:

    private final WebClient webClient = WebClient.builder()
            .baseUrl("https://another_host.com/api/get_inf")
            .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
            .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
            .build();
    

    谢谢你。

  • 共有1个答案

    甄志
    2023-03-14

    关于WebClient,这里有两个关键问题:

    1. 它的HTTP资源(连接、缓存等)由基础库管理,由可以在WebClient
    2. 上配置的 ClientTtpConnector引用
    3. WebClient是不可变的

    考虑到这一点,您应该尝试在应用程序中重用相同的ClientHTtpConnector,因为这将共享连接池--这可以说是对性能最重要的事情。这意味着您应该尝试从同一个webclient.create()调用派生所有WebClient实例。Spring Boot通过为您创建和配置一个webclient.builderbean,您可以将该bean注入到应用程序的任何位置,从而帮助您实现这一点。

    WebClient baseClient = WebClient.create().baseUrl("https://example.org");
    
    Mono<ClientResponse> response = baseClient.get().uri("/resource")
                    .header("token", "secret").exchange();
    
    // mutate() will *copy* the builder state and create a new one out of it
    WebClient authClient = baseClient.mutate()
                    .defaultHeaders(headers -> {headers.add("token", "secret");})
                    .build();
    
     类似资料:
    • 我的程序使用ZMQ进行通信。也就是说,服务器(C、linux)创建一个XPUB套接字,然后在一个线程中读取它,在另一个线程中发布数据(写入)。 客户端(java、jzmq、linux)创建一个SUB套接字,并订阅使用它。 一段时间后,服务器端在读取线程中接收SIGABRT。 什么可能是问题的根源?在不同的线程中读/写或创建XPUB/SUB对? 如果问题是在多线程中,那么使用XPUB套接字的正确范例

    • 我正在使用多线程执行插入操作。我使用了带注释的方法,我的方法是注释。但我无法执行插入操作,导致出现以下异常。 异常线程"Thread-21"javax.persistence.Transaction必需异常:在org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:96)在sun.reflect.Native

    • 问题内容: 我正在开发一个项目,在该项目中,我需要对正在运行的服务器进行HTTP URL调用,该服务器将响应作为JSON字符串返回。 下面是我的主要代码,它使用和- 下面是我的类,它实现接口并使用… 现在我有下面的代码在另一大类它调用的方法类顺序- 所以我的问题是在这里应该是静态的,就像我正确看到的一样,我正在为每个请求重新创建整个连接池,而我猜这不是正确的方法。 注意: 如果我将RestTemp

    • 问题内容: 一段时间以来,我一直在多线程环境中使用HttpClient。对于每个线程,当它启动连接时,它将创建一个全新的HttpClient实例。 最近,我发现使用这种方法可能导致用户打开太多端口,并且大多数连接处于TIME_WAIT状态。 http://www.opensubscriber.com/message/commons-httpclient- dev@jakarta.apache.or

    • 我正在做一个项目,在这个项目中,我需要对运行

    • 我正在尝试编写一个SNMP代理,可以用来监视python进程。为此,我编写了一个使用pysnmp实现SNMP代理的类。 该代理的核心部分工作正常(即,我可以使用snmpwalk询问代理,并且返回的数据是正确的)。为了更新代理MIB值,我在自己的线程中运行了dispatcher()。我的问题是,当使用snmpwalk与代理交谈时,我会超时(snmpwalk正确地遍历MIB,但随后超时)。 有人知道我