首页 > 解决方案 > 使用 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。

标签: javaweb-servicesnonblocking

解决方案


推荐阅读