2012-08-30 171 views
1

我想要使用.NET製作的web服務。爲了生成我的源代碼,我使用了基於Web服務的WSDL的Axis2。我沒有選擇地推出Axis。Axis2創建持久連接

我可以調用webservice的第一個方法。這是Web服務的認證方法「連接」。在此之後,我再次調用一個新方法,但web服務表明我沒有更多的連接。 Web服務的支持告訴我這是因爲在我調用connect方法之後,連接被java關閉。而這個,web服務假設我斷開連接並關閉了會話。

爲了解決這個問題,我的successif調用這兩個方法應該保持在線連接。但是,我不確定Axis2是否提供了這些功能,這是真的嗎?

如何保持不同通話間的連接?

這裏是我的Java代碼:

WinbooksWebServiceStub stub = new WinbooksWebServiceStub("http://myUrl/Service.asmx"); 
Connect c = new Connect(); 
c.setKey("KEY"); 
c.setUser("USER"); 
c.setPass("PSW"); 

ConnectResponse resp = stub.connect(c); 
ConnectParser connecterParser = new ConnectParser();//works and return the Token 

HelloWorld h = new HelloWorld(); 
HelloWorldResponse Hresp = stub.helloWorld(h); //the result tell me that I'm not connected 

如果我按照答案,我在我的存根對象上應用的方法,我在線程這個錯誤異常「主」

org.apache.axis2.AxisFault: Attempted read on closed stream. 
at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430) 
at org.apache.axis2.builder.SOAPBuilder.processDocument(SOAPBuilder.java:64) 
at org.apache.axis2.transport.TransportUtils.createDocumentElement(TransportUtils.java:179) 
at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:145) 
at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:108) 
at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:67) 
at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:354) 
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:421) 
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229) 
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165) 
at com.logidrive.ws.WinbooksWebServiceStub.connect(WinbooksWebServiceStub.java:4251) 
at Main.main(Main.java:44) Caused by: java.io.IOException: Attempted read on closed stream. 
at org.apache.commons.httpclient.AutoCloseInputStream.isReadAllowed(AutoCloseInputStream.java:183) 
at org.apache.commons.httpclient.AutoCloseInputStream.read(AutoCloseInputStream.java:107) 
at java.io.FilterInputStream.read(FilterInputStream.java:116) 
at org.apache.axiom.om.util.DetachableInputStream.read(DetachableInputStream.java:147) 
at java.io.FilterInputStream.read(FilterInputStream.java:116) 
at java.io.PushbackInputStream.read(PushbackInputStream.java:169) 
at org.apache.axis2.builder.BuilderUtil.getCharSetEncoding(BuilderUtil.java:294) 
at org.apache.axis2.builder.SOAPBuilder.processDocument(SOAPBuilder.java:51) 

回答

1

你有兩個問題正在進行。我不知道爲什麼你沒有連接,但你可以爲高容量請求做一個http連接池。

這裏是談論如何做到這一點Axis2 Blog

而且,這裏是設置一些代碼從Here

編輯更新代碼

import org.apache.axis2.client.Stub; 
import org.apache.axis2.context.ConfigurationContext; 
import org.apache.axis2.transport.http.HTTPConstants; 
import org.apache.commons.httpclient.HttpClient; 
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; 
import org.apache.commons.httpclient.params.HttpConnectionManagerParams; 

public static void setContextProperties(Stub stub) { 

    // Set the max connections to 20 and the timeout to 20 seconds 
    MultiThreadedHttpConnectionManager multiThreadedHttpConnectionManager = new MultiThreadedHttpConnectionManager(); 

    HttpConnectionManagerParams params = new HttpConnectionManagerParams(); 
    params.setDefaultMaxConnectionsPerHost(20); 
    params.setMaxTotalConnections(20); 
    params.setSoTimeout(20000); 
    params.setConnectionTimeout(20000); 
    multiThreadedHttpConnectionManager.setParams(params); 

    HttpClient httpClient = new HttpClient(multiThreadedHttpConnectionManager); 

    stub._getServiceClient().getServiceContext().getConfigurationContext().setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient); 
} 
+0

THX一個博客,我試過你的解決方案,但我得到了錯誤。我在另一個答案中寫下了錯誤信息.Sorry – user1636532

+0

我沒有放過它,因爲它困擾着我。要重新使用連接,請在調用connect之前調用它,因爲它在套接字打開時使用。我有一個關於池設置的問題,我將對它進行研究...... stub._getServiceClient()。getOptions()。setProperty(org.apache.axis2.transport.http.HTTPConstants.REUSE_HTTP_CLIENT,new Boolean(true)) ; – Mike

+0

修改了代碼。它現在應該工作。請記住在調用任何例程之前設置上下文屬性。此外,評論中上面的一行代碼默認會給你兩個連接。 – Mike