如何在没有管理器的情况下使用 apache HttpClient?

How to use the apache HttpClient without manager?

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

来自documentation

BasicHttpClientConnectionManager is a simple connection manager that maintains only one connection at a time. [...] This connection manager implementation should be used inside an EJB container.

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

您不能使用 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