axis2生成的webservice类,出现错误无法重新处理

zpingy 2018-01-10 08:42:25
现象:
类为axis2生成的存根类。
多线程频繁循环调用某个方法获取状态,一个线程报异常后无法循环重新读取状态值,显示异常见后;另外一个线程仍然可以正常调用此方法获取状态。请问大家遇到过这一的情况吗?有什么解决的方法。
org.apache.axis2.AxisFault: com.ctc.wstx.exc.WstxIOException: Attempted read on closed stream.
at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:122)
at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:66)
at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:347)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:414)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:225)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:150)
at com.kcsm.pms.wcs.bis.atis4axis2kczn.AMWHCIWebServiceCLStub.getContainerByID(AMWHCIWebServiceCLStub.java:3561)
at com.kcsm.pms.wcs.bis.imp.Atis4Bis.getContainerById(Atis4Bis.java:246)
at com.kcsm.pms.wcs.service.imp.Atis4ServiceImp.executeJobToCheckPointStart(Atis4ServiceImp.java:244)
at com.kcsm.pms.wcs.service.imp.JobExecutingService.executeJobBeforeStartAtis4(JobExecutingService.java:738)
at com.kcsm.pms.wcs.service.imp.JobExecutingService.jobExecuting(JobExecutingService.java:186)
at com.kcsm.pms.wcs.service.imp.JobExecutingService.jobExecuting(JobExecutingService.java:120)
at com.kcsm.pms.wcs.service.imp.JobExecutingRunner.run(JobExecutingRunner.java:47)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxIOException: Attempted read on closed stream.
at org.apache.axiom.om.impl.common.factory.AbstractOMMetaFactory.createXMLStreamReader(AbstractOMMetaFactory.java:142)
at org.apache.axiom.om.impl.common.factory.AbstractOMMetaFactory.createSOAPModelBuilder(AbstractOMMetaFactory.java:228)
at org.apache.axiom.om.OMXMLBuilderFactory.createSOAPModelBuilder(OMXMLBuilderFactory.java:542)
at org.apache.axiom.om.OMXMLBuilderFactory.createSOAPModelBuilder(OMXMLBuilderFactory.java:521)
at org.apache.axis2.builder.SOAPBuilder.processDocument(SOAPBuilder.java:51)
at org.apache.axis2.transport.TransportUtils.createDocumentElement(TransportUtils.java:203)
at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:144)
at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:107)
... 15 more
Caused by: com.ctc.wstx.exc.WstxIOException: Attempted read on closed stream.
at com.ctc.wstx.stax.WstxInputFactory.doCreateSR(WstxInputFactory.java:536)
at com.ctc.wstx.stax.WstxInputFactory.createSR(WstxInputFactory.java:585)
at com.ctc.wstx.stax.WstxInputFactory.createSR(WstxInputFactory.java:610)
at com.ctc.wstx.stax.WstxInputFactory.createXMLStreamReader(WstxInputFactory.java:316)
at org.apache.axiom.util.stax.wrapper.XMLInputFactoryWrapper.createXMLStreamReader(XMLInputFactoryWrapper.java:95)
at org.apache.axiom.util.stax.wrapper.WrappingXMLInputFactory.createXMLStreamReader(WrappingXMLInputFactory.java:116)
at org.apache.axiom.util.stax.wrapper.XMLInputFactoryWrapper.createXMLStreamReader(XMLInputFactoryWrapper.java:95)
at org.apache.axiom.util.stax.wrapper.WrappingXMLInputFactory.createXMLStreamReader(WrappingXMLInputFactory.java:116)
at org.apache.axiom.util.stax.wrapper.XMLInputFactoryWrapper.createXMLStreamReader(XMLInputFactoryWrapper.java:95)
at org.apache.axiom.om.util.StAXUtils.createXMLStreamReader(StAXUtils.java:192)
at org.apache.axiom.om.impl.common.factory.AbstractOMMetaFactory.createXMLStreamReader(AbstractOMMetaFactory.java:113)
... 22 more
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(Unknown Source)
at org.apache.axiom.om.util.DetachableInputStream.read(DetachableInputStream.java:147)
at org.apache.axiom.om.impl.common.factory.DetachableInputStream.read(DetachableInputStream.java:48)
at com.ctc.wstx.io.BaseReader.readBytes(BaseReader.java:155)
at com.ctc.wstx.io.UTF8Reader.loadMore(UTF8Reader.java:368)
at com.ctc.wstx.io.UTF8Reader.read(UTF8Reader.java:111)
at com.ctc.wstx.io.ReaderBootstrapper.initialLoad(ReaderBootstrapper.java:250)
at com.ctc.wstx.io.ReaderBootstrapper.bootstrapInput(ReaderBootstrapper.java:133)
at com.ctc.wstx.stax.WstxInputFactory.doCreateSR(WstxInputFactory.java:531)
... 32 more
...全文
419 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianfang 2018-01-12
  • 打赏
  • 举报
回复 1
axis2的客户端官方承认不是线程安全的 https://issues.apache.org/jira/browse/AXIS2-4357 最后一个回复 解决方法: 试试用cxf做客户端 http://cxf.apache.org/faq.html#FAQ-AreJAX-WSclientproxiesthreadsafe?
说明:
由于上传速度的问题例子面没有加包,请下载后自己将Axis 1.4的lib包放到你的工程里头就可以了。
当然可以调用任何 wsdl地址。只要是webservice
这里是比较流行的。
这里有2个测试地址。
(1):http://www.webservicex.com/stockquote.asmx
(2):http://test.payment.net.tw/MPWebService/Main.asmx
分别对应我例子里的2个包。
运行test/WsTest.java 就可以看到结果了。



生成了代理之后,就会有2个。在bin里有一个叫 src的文件夹。将里面的文件拷贝到工程里面,这里有个BUG,生成的代理有的时候会报一个错Long.toString(System.currentTimeMillis() 不能转换String的错误。可以用下面的方法改下。
private static synchronized String getUniqueSuffix(){
// reset the counter if it is greater than 99999
if (counter > 99999){
counter = 0;
}
counter = counter + 1;
String ss=new String();
ss.setString(Long.toString(System.currentTimeMillis()) + "_" + counter);
return ss;
}

看到了没有,没错吴了吧。
对了。有的人估计还不会用Axis 吧。Axis 1.1 会生成很多个代理。Axis 1.4就只有2个,看你喜欢用那个版本吧,我例子里是用的1.4的版本,觉得高版本有他的高明之处。废话就不多说了,怎么样生成代理呢,很简单,下载Axis 进入DOS,进入Axis里的bin目录,OK,在dos里输入 axis -uri http://你的webservice地址 + ?wsdl 回车,看看你的bin里头是不是多了个src。下面的事我就不啰嗦了。不懂的MSN:liubingbbbb@hotmail.com

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧