2016-10-14 18 views
0

SOAP Webサービスを呼び出すためにcxfクライアントを作成すると、connection refusedまたはUnexpected end of file from serverが返されます。しかし、それはちょうど最初のリクエストで起こります。その後、クライアントが "ウォームアップ"して実際に動作するようです。CXF SOAPクライアントが最初の実行時に接続に失敗する

これはなぜ起こっているのですか?

if -statementは、クライアントがすべての呼び出しだけではなく、最初に失敗する原因となる削除
... 
if(port == null) { 
    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
    factory.getInInterceptors().add(new LoggingInInterceptor()); 
    factory.getOutInterceptors().add(new LoggingOutInterceptor()); 
    factory.setAddress("http://localhost:9000/helloWorld"); 
    port = factory.create(HelloWorld.class); 

    ... 
    Client client= ClientProxy.getClient(port); 
    HTTPConduit http = (HTTPConduit) client.getConduit(); 
    HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 
    httpClientPolicy.setAllowChunking(false); 
    http.setClient(httpClientPolicy); 
} 

port.someMethod(); // fails on first run, but succeeds on all following runs 
... 

。私は本当に立ち往生し、どんな助けにも感謝します。

答えて

0

TLS 1.2で問題が発生したようです。 Java8の場合、TLSv1からTLSv1.2へのdefault TLS version changed。 TLS 1.2はCXF(3.1.7)の最新バージョンでも機能していないようです。したがって、ソリューションはCXFに使用するTLSバージョンを設定することでした:

... 
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 
httpClientPolicy.setAllowChunking(false); 
httpClientPolicy.setAutoRedirect(true); 
httpClientPolicy.setConnection(ConnectionType.KEEP_ALIVE); 

String proxyUrl = "http://proxy.com"; 
String proxyPortString = "8080"; 
HTTPConduit http = (HTTPConduit)client.getConduit(); 
SSLContext sslContext = SSLContext.getInstance("TLSv1"); 
sslContext.init(null, null, null); 
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); 
TLSClientParameters tlsClientParameters = new TLSClientParameters(); 
tlsClientParameters.setUseHttpsURLConnectionDefaultSslSocketFactory(true); 

http.setTlsClientParameters(tlsClientParameters); 
http.setClient(httpClientPolicy); 
関連する問題