java - 使用 AsyncHTTPConduit CXF (JAVA) 的非阻塞 Web 服务客户端
问题描述
我正在尝试在 JAVA 中创建一个非 I/O 阻塞 Web 服务客户端。我正在使用 CXF 的 AsyncHTTPConduit。
但是,当有 2 个请求时,它似乎会创建一个新连接而不是重用它。它将创建新的动态端口来发送 Web 服务。
源代码: public Dispatch getDispatcher(String alias, String namespace, String wsdlLocation, String serviceName, String portName) throws IOException, GeneralSecurityException {
Dispatch<Source> dispatcher = getDispatcher(wsdlLocation, namespace, serviceName, portName);
// Create our custom SSLSocketFactory
SSLSocketFactory socketFactory = new SSLSocketFactoryGenerator(alias, keyStoreLocation, trustStoreLocation)
.getSSLSocketFactory();
Client client = ((org.apache.cxf.jaxws.DispatchImpl) dispatcher).getClient();
client.getRequestContext().put("use.async.http.conduit", true);
client.getRequestContext().put(AsyncHTTPConduit.USE_ASYNC, AsyncHTTPConduitFactory.UseAsyncPolicy.ALWAYS);
client.getRequestContext().put("org.apache.cxf.transport.http.async.MAX_CONNECTIONS", 501);
HTTPConduit conduit = (HTTPConduit) client.getConduit();
System.out.println("testtest: "+conduit.getClass().getName());
TLSClientParameters tlsClientParameters = new TLSClientParameters();
tlsClientParameters.setSSLSocketFactory(socketFactory);
conduit.setTlsClientParameters(tlsClientParameters);
conduit.getClient().setConnection(ConnectionType.KEEP_ALIVE);
conduit.getClient().setReceiveTimeout(10000000L);
return dispatcher;
}
调用调度程序发送 Web 服务:
Source requestSource = (new StreamSource(new StringReader(request)));
MyHandler handler = new MyHandler();
Future<?> f = dispatch.invokeAsync(requestSource, handler);
Thread.sleep(3000);
MyHandler handler2 = new MyHandler();
Source requestSource2 = (new StreamSource(new StringReader(request)));
Future<?> f2 = dispatch.invokeAsync(requestSource2, handler2);
日志文件:
08:24:35.491 [I/O 调度程序 1] 调试 org.apache.http.impl.nio.conn.ManagedNHttpClientConnectionImpl - http-outgoing-0 127.0.0.1:13629<->127.0.0.1:8080[ACTIVE][rw :w]: 542 字节写入 08:24:35.491 [I/O 调度程序 1] 调试 org.apache.http.wire - http-outgoing-0 >> "POST /fghet/sd/qqwsdfdd?wsdl HTTP/1.1[\ r][\n]" 08:24:35.491 [I/O 调度程序 1] 调试 org.apache.http.wire - http-outgoing-0 >> "接受:/[\r][\n]" 08:24:35.491 [I/O dispatcher 1] DEBUG org.apache.http.wire - http-outgoing-0 >> "User-Agent: Apache CXF 3.1.4.redhat- 1[\r][\n]" 08:24:35.491 [I/O 调度程序 1] 调试 org.apache.http.wire - http-outgoing-0 >> "连接:保持活动 [\r][\ n]" 08:24:35.491 [I/O 调度程序 1] 调试 org.apache.http.wire - http-outgoing-0 >> "Content-Length: 323[\r][\n]" 08:24: 35.491 [I/O 调度程序 1] 调试 org.apache.http.wire - http-outgoing-0 >> “内容类型:应用程序/soap+xml; charset=UTF-8[\r][\n]" 08:24:35.491 [I/O dispatcher 1] DEBUG org.apache.http.wire - http-outgoing-0 >> "Host: localhost:8080[\ r][\n]" 08:24:35.491 [I/O 调度程序 1] 调试 org.apache.http.wire - http-outgoing-0 >> "[\r][\n]" 08:24:35.491 [I/O 调度程序 1] 调试 org.apache.http。http://localhost:8080 08:24:38.469 [main] DEBUG org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager - 连接请求:[路由:{}-> http://localhost:8080][total保持活力:0;分配的路线:1000 条;总分配:1 of 5000] 08:24:38.470 [I/O 调度程序 2] 调试 org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager - 连接租用:[id: http-outgoing-1][route: { }-> http://localhost:8080][总计保持活力:0;分配的路线:1000 条中的 2 条;分配的总数:2 of 5000] 08:24:38.470 [I/O 调度程序 2] 调试 org.apache.http.impl.nio.client.InternalHttpAsyncClient - [交换:2] 分配的连接:CPoolProxy {http-outgoing-1 [ ACTIVE]} 08:24:38.470 [I/O 调度程序 2] 调试 org.apache.http.impl.nio.conn.ManagedNHttpClientConnectionImpl - http-outgoing-1 127.0.0.1:13630<->127.0.0.1:8080[ACTIVE ][r:]: 设置属性 http.nio.exchange-handler 08:24:38.470 [I/O dispatcher 2] DEBUG org.apache.http.impl.nio.conn.ManagedNHttpClientConnectionImpl - http-outgoing-1 127.0.0.1 :13630<->127.0.0.1:8080[ACTIVE][rw:]: 事件集 [w] 08:24:38.470 [I/O dispatcher 2] DEBUG org.apache.http.impl.nio.conn.ManagedNHttpClientConnectionImpl - http-outgoing-1 127.0.0.1:13630<->127.0.0.1:8080[ACTIVE][rw:]:设置超时 0 08:24:38。
解决方案
推荐阅读
- python - Length of a datetimeindex in python
- android - 方向更改时带有列表视图的自定义对话框(横向模式)
- c - 为什么我在 C-Posix 代码中有这个信号量问题?
- android - 存在 TextWatcher 时退格/删除时的 EditText 光标位置
- javascript - 如何执行脚本 Selenium - TypeError : .... 未定义
- docker - 当我在 docker 上执行 npm install 时出现问题
- python - 在控制台中显示下载进度
- c# - 如何设置相机与缩放对象的距离?
- java - 找不到方法“io.realm.annotations.RealmClass.name”
- python - Django:如何在管理面板中检测对象请求?