如何在没有管理器的情况下使用 apache HttpClient?
How to use the apache HttpClient without manager?
虽然 HttpClient 的正常使用工作正常,但我很难理解连接管理器部分。
BasicHttpClientConnectionManager 和 PoolingHttpClientConnectionManager 似乎都不能满足我的用例。我 运行 在 JEE 应用程序服务器中并使用 HttpClient 来使用休息服务。
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
虽然 HttpClient 的正常使用工作正常,但我很难理解连接管理器部分。 BasicHttpClientConnectionManager 和 PoolingHttpClientConnectionManager 似乎都不能满足我的用例。我 运行 在 JEE 应用程序服务器中并使用 HttpClient 来使用休息服务。
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