Have written a very simple SOAP service exposed by the services.xml and the
XFireConfigurableServlet which simply adds two number together and returns
the result. The service uses XmlBeans for the binding. It works on all
JDK's without issues so long as I only have one client at a time using
it.
However, if more than one client is used then then I get random errors on
the server side when I run it on JDK1.5 or 1.6. This happens with my multi
threaded Java test client or when just running simultaneous curl scripts so
the issue is definitely server side.
Have also tried this on multiple platforms WinXP/Ubuntu/Centos with always
the same result. Have also tried on different JBoss versions. On JDK1.4 it
works rock solid with 20 clients going flat out for 120000 requests with no
errors. On JDK 1.5 or 1.6, I get errors with just 2 clients and 10
requests. It seems from the stack traces to be something going wrong with
the XML stream parsing. The stack trace varies from one run to the next so
have included a couple of examples below.
20:39:42,922 INFO [DefaultFaultHandler] Fault occurred!
com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '<' (code
60) excepted space, or '>' or "/>"
at [row,col {unknown-source}]: [1,180]
at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java
:623)
at com.ctc.wstx.sr.BasicStreamReader.handleNsAttrs(
BasicStreamReader.java:2963)
at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(
BasicStreamReader.java:2934)
at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java
:2846)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1019)
at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(
ReadHeadersHandler.java:44)
at org.codehaus.xfire.handler.HandlerPipeline.invoke(
HandlerPipeline.java:131)
at org.codehaus.xfire.transport.DefaultEndpoint.onReceive(
DefaultEndpoint.java:64)
at org.codehaus.xfire.transport.AbstractChannel.receive(
AbstractChannel.java:38)
at org.codehaus.xfire.transport.http.XFireServletController.invoke(
XFireServletController.java:304)
at org.codehaus.xfire.transport.http.XFireServletController.doService(
XFireServletController.java:129)
at org.codehaus.xfire.transport.http.XFireServlet.doPost(
XFireServlet.java:116)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(
ApplicationFilterChain.java:173)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(
ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(
ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(
StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(
StandardContextValve.java:178)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(
SecurityAssociationValve.java:175)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(
JaccContextValve.java:74)
at org.apache.catalina.core.StandardHostValve.invoke(
StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(
ErrorReportValve.java:105)
at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(
CachedConnectionValve.java:156)
at org.apache.catalina.core.StandardEngineValve.invoke(
StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(
CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java
:869)
at
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection
(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(
PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(
MasterSlaveWorkerThread.java:112)
at java.lang.Thread.run(Thread.java:619)
Another example stacktrace
20:47:54,902 INFO [DefaultFaultHandler] Fault occurred!
com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog
at [row,col {unknown-source}]: [1,0]
at com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOF(StreamScanner.java
:661)
at com.ctc.wstx.sr.BasicStreamReader.handleEOF(BasicStreamReader.java
:2134)
at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(
BasicStreamReader.java:2040)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1069)
at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(
ReadHeadersHandler.java:44)
at org.codehaus.xfire.handler.HandlerPipeline.invoke(
HandlerPipeline.java:131)
at org.codehaus.xfire.transport.DefaultEndpoint.onReceive(
DefaultEndpoint.java:64)
at org.codehaus.xfire.transport.AbstractChannel.receive(
AbstractChannel.java:38)
at org.codehaus.xfire.transport.http.XFireServletController.invoke(
XFireServletController.java:304)
at org.codehaus.xfire.transport.http.XFireServletController.doService(
XFireServletController.java:129)
at org.codehaus.xfire.transport.http.XFireServlet.doPost(
XFireServlet.java:116)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(
ApplicationFilterChain.java:173)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(
ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(
ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(
StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(
StandardContextValve.java:178)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(
SecurityAssociationValve.java:175)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(
JaccContextValve.java:74)
at org.apache.catalina.core.StandardHostValve.invoke(
StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(
ErrorReportValve.java:105)
at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(
CachedConnectionValve.java:156)
at org.apache.catalina.core.StandardEngineValve.invoke(
StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(
CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java
:869)
at
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection
(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(
PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(
MasterSlaveWorkerThread.java:112)
at java.lang.Thread.run(Thread.java:619)
My services.xml
<!-- START SNIPPET: services -->
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>CalculatorServiceV1-0</name>
<namespace>http://services.aaa.com/CalculatorService/1/0</namespace>
<serviceClass>nz.co.aaa.vtestapp.server.CalculatorServiceV1x0
</serviceClass>
<implementationClass>nz.co.aaa.vtestapp.server.CalculatorServiceImplV1x0
</implementationClass>
<serviceFactory>org.codehaus.xfire.xmlbeans.XmlBeansServiceFactory
</serviceFactory>
</service>
</beans>
My service implementation. Nothing that is thread unsafe here...
public class CalculatorServiceImplV1x0
implements CalculatorServiceV1x0
{
public CalculatorRSDocument calculate(CalculatorRQDocument request)
throws XFireFault
{
CalculatorRQ calculatorRQ = request.getCalculatorRQ();
int result = calculatorRQ.getFirstNumber() +
calculatorRQ.getSecondNumber();
CalculatorRSDocument response = CalculatorRSDocument.Factory.newInstance
();
CalculatorRS calculatorRS = response.addNewCalculatorRS();
calculatorRS.setResult(result);
return response;
}
Has anybody any idea why such a simple SOAP service should not work reliably
when used by multiple clients when run the service is run on JDK1.5 or
JDK1.6 when it runs perfectly on JDK1.4 ?
David
PS. I did check that JBoss itself was OK (of course it was) when running
multiple simultaneous requests against a servlet . Have also tried
different scopes for the service in the services.xml, but as you can see
from the simplicity of the implementation, it should work in any scope.
I have seen the XML beans hack suggestion and have also tried using that and
registering the service manually. Always the same results., JDK1.4 OK,
JDK1.5/1.6 bad.