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

HttpClient在单例中的并发

仉昂熙
2023-03-14

我使用Spring Boot创建了一个服务(微服务设计的一部分)。我有下面的方法,

public static HttpClient getHttpClient() throws KeyManagementException, NoSuchAlgorithmException {

        log.info("Creating Http Client...");
        final SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
                new SSLContextBuilder().build());
        final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        connectionManager.setMaxTotal(200);
        connectionManager.setDefaultMaxPerRoute(20);

        return HttpClients.custom()
                .disableRedirectHandling()
                .setSSLSocketFactory(sslConnectionSocketFactory)
                .setConnectionManager(connectionManager)
                .build();
    }

我多次调用此方法,希望只维护一个实例并在创建后重用它。考虑到并发编程,我可以使用单例模式吗?根据下面的链接,我看到RestTemboard是非常好的方法,而不是Apache Http Client,

RestTemplate与ApacheHTTP客户端在spring项目中的生产代码

非常感谢您的建议。

共有2个答案

狄冥夜
2023-03-14

首先,您应该使用spring内核的依赖注入,而不是直接使用方法来让实例在spring中工作。依赖注入(DI)容器将为您生成所需的实例并注入它。通过设置范围或使用特殊注释,可以配置DI容器生成实例的频率。关于Spring中具有自定义作用域的DI的代码示例,可以在下面找到一个很好的解释:https://www.baeldung.com/spring-bean-scopes

其次,我建议使用Spring RestTemplate,并通过RestTemplateBuilder或RestTemplateCustomizer根据您的需要进行配置https://www.baeldung.com/spring-rest-template-builder在RestTemplate中,spring已经提供了很多测试设置类,使JUnit测试变得简单,如果您已经在spring框架中工作,建议使用spring提供的选项。

金宣
2023-03-14

我建议您使用Spring RestTemboard。在您的应用程序中仅实例化RestTemboard实例一次,然后使用依赖注入在多个服务/组件类中使用它。

创建RestTemplate实例的最佳方法是在spring配置类中将其注册为spring bean。这将在应用程序启动时创建RestTemplate的实例。下面的代码将创建RestTemplate的一个实例,它可以在多个类之间共享。

@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
//if you want to set any properties in RestTemplate, set here
return restTemplate;
}

现在,要在任何服务类中使用RestTemplate,请使用依赖项注入:

@Service
class TestService {

@Autowired
private RestTemplate restTemplate

public void invokeRemoteService(){
//Here you are using restTemplate 
  String response = 
      restTemplate.postForObject(url, request, String.class);
}

}
 类似资料:
  • null 在第一种方法中,我在mobile Applicaiton发出的每个新请求中创建新的http客户机对象。 这是我的代码 邮递请求代码

  • 主要内容:Maven依赖关系,提交HTML表单参数示例许多应用程序需要模拟提交HTML表单的过程,以便登录到Web应用程序或提交输入数据。 HttpClient提供实体类来促进该过程。 以下教程显示了如何使用apache HttpClient 4.5发送HTML表单参数。 Maven依赖关系 我们使用maven来管理依赖关系,并使用Apache HttpClient 4.5版本。 将以下依赖项添加到您的项目中。 pom.xml 文件的内容如下 - 提

  • 我在尝试包装我的代码以用于单元测试时遇到了一些问题。问题是。我有接口IHttpHandler: 现在很明显,我将在Connection类中有一些方法,这些方法将从my后端检索数据(JSON)。但是,我想为这个类编写单元测试,显然我不想编写针对真实后端的测试,而是一个被嘲弄的测试。我曾尝试谷歌一个很好的答案,但没有很大的成功。我以前可以并且曾经使用过Moq来模拟,但是从来没有在像HttpClient

  • 主要内容:Maven依赖关系,HttpRequestRetryHandler示例在以下示例中,我们演示了如何创建自定义以启用自定义异常恢复机制。 当使用这个接口时,需要实现方法。 这使我们能够定义一个自定义的重试计数机制和异常恢复机制。 看看下面的教程是如何实现的。 Maven依赖关系 我们使用maven来管理依赖关系,并使用Apache HttpClient 4.5版本。 将以下依赖项添加到您的项目中。 pom.xml 文件的内容如下 - HttpRequestRetryH

  • 我与一位同事讨论了单例会话bean中的并发管理。根据我的理解,在阅读了Oracle文档之后,如果您取消了注释,那么它默认为容器管理的并发。在文档中,它说明了以下关于容器管理的单例会话bean的内容: javax.ejb.Lock注释和javax.ejb.LockType类型用于指定单例业务方法或@Timeout方法的访问级别。 和 如果singleton类上不存在@Lock注释,则默认的锁类型@L

  • 我有一个类,它调用两个单例类FirstClass和SecondClass,如下所示。有没有一种方法可以在第二类中访问第一类中计算的数据。在这种情况下,我不想在第二类中进行外部服务调用,因为第一类已经调用了它。相反,只需在第二个数据函数中使用数据(存储在第一类函数中)。有什么方法可以做到。