【问题标题】:How to use the apache HttpClient without manager?如何在没有管理器的情况下使用 apache HttpClient?
【发布时间】:2017-03-29 11:20:59
【问题描述】:

虽然 HttpClient 的正常使用工作正常,但我很难将我的头绕在连接管理器部分。 BasicHttpClientConnectionManager 和 PoolingHttpClientConnectionManager 似乎都不能满足我的用例。我在 JEE 应用程序服务器中运行,并使用 HttpClient 来消费休息服务。

来自documentation

BasicHttpClientConnectionManager 是一个简单的连接管理器,一次只维护一个连接。 [...] 此连接管理器实现应在 EJB 容器内使用。

但我想做一些池化,最好是我自己的池化(例如 JCA 适配器)。我想简单地创建一个 HttpClient 并拥有自己的带有 HttpClients 的单独池,而无需连接管理器。 有什么建议或解决方案吗?

【问题讨论】:

    标签: java jakarta-ee apache-httpclient-4.x


    【解决方案1】:

    你不能用 HttpClient 真正做到这一点,但你可以用 HttpCore,传输工具包 HttpClient 基于

    public static void main(String[] args) throws Exception {
        HttpProcessor httpproc = HttpProcessorBuilder.create()
            .add(new RequestContent())
            .add(new RequestTargetHost())
            .add(new RequestConnControl())
            .add(new RequestUserAgent("Test/1.1"))
            .add(new RequestExpectContinue(true)).build();
    
        HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
    
        HttpCoreContext coreContext = HttpCoreContext.create();
        HttpHost host = new HttpHost("localhost", 8080);
        coreContext.setTargetHost(host);
    
        DefaultBHttpClientConnection conn = new DefaultBHttpClientConnection(8 * 1024);
        ConnectionReuseStrategy connStrategy = DefaultConnectionReuseStrategy.INSTANCE;
    
        try {
    
            String[] targets = {
                    "/",
                    "/servlets-examples/servlet/RequestInfoExample",
                    "/somewhere%20in%20pampa"};
    
            for (int i = 0; i < targets.length; i++) {
                if (!conn.isOpen()) {
                    Socket socket = new Socket(host.getHostName(), host.getPort());
                    conn.bind(socket);
                }
                BasicHttpRequest request = new BasicHttpRequest("GET", targets[i]);
                System.out.println(">> Request URI: " + request.getRequestLine().getUri());
    
                httpexecutor.preProcess(request, httpproc, coreContext);
                HttpResponse response = httpexecutor.execute(request, conn, coreContext);
                httpexecutor.postProcess(response, httpproc, coreContext);
    
                System.out.println("<< Response: " + response.getStatusLine());
                System.out.println(EntityUtils.toString(response.getEntity()));
                System.out.println("==============");
                if (!connStrategy.keepAlive(response, coreContext)) {
                    conn.close();
                } else {
                    System.out.println("Connection kept alive...");
                }
            }
        } finally {
            conn.close();
        }
    

    示例代码取自here

    【讨论】:

    • 有趣。我遇到的问题是希望能够拥有一个真正的 httpclient,以便像 Spring Resttemplate 这样的框架可以使用它。我看不出在那种情况下会如何工作。
    • 扩展 CloseableHttpClient 并以您认为合适的任何方式实现其#doExecute 方法,没有什么可以阻止的。唯一重要的任务可能是实现 CloseableHttpResponse 并确保正确释放与响应流相关的底层连接
    • 所以我们可以将 doExecute 委托给 HttpRequestExecutor,并将响应包装在我们自己的 HttpResponseProxy 中。另外我需要对 ssl 连接做一些事情,但我可以看到你在做什么。谢谢!
    猜你喜欢
    • 2023-01-18
    • 2014-03-01
    • 2017-03-05
    • 1970-01-01
    • 2011-03-05
    • 2014-03-17
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多