【问题标题】:Axis2 create persistent connectionAxis2 创建持久连接
【发布时间】:2016-11-24 01:02:45
【问题描述】:

我想使用 .NET 制作的网络服务。为了生成我的源代码,我使用了基于 Web 服务的 WSDL 的 Axis2。我在没有选项的情况下启动了 Axis。

我可以调用webservice的第一个方法。这是网络服务的认证方法“连接”。在此之后,我再次调用了一个新方法,但网络服务表明我不再连接。 Web服务的支持告诉我这是因为在我调用connect方法后,连接被java关闭了。而这个,网络服务假定我已断开连接并关闭我的会话。

为了解决这个问题,我对这两种方法的成功调用应该保持实时连接。但是,我不确定 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

如果我按照答案,我在我的存根对象上应用方法,我在线程“main”中得到这个错误异常

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)

【问题讨论】:

    标签: java wsdl axis2 keep-alive


    【解决方案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);
    }
    

    【讨论】:

    • 谢谢,我尝试了你的解决方案,但我得到了错误。我在另一个答案中写了消息错误..对不起
    • 我没有放过这个,因为它让我很困扰。要重用连接,请在调用 connect 之前调用它,因为它在套接字打开时使用。我的池设置有问题,我会处理它... stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.REUSE_HTTP_CLIENT, new Boolean(true)) ;
    • 编辑了代码。它现在应该可以工作了。请记住在调用任何例程之前设置上下文属性。此外,默认情况下,cmets 中的一个衬垫上方将为您提供两个连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2017-07-12
    • 2014-09-08
    相关资源
    最近更新 更多