Hi,

I'm writing a web service client (with maven and spring) which calles a web service periodically (using the quarz framework for job scheduling). The whole code is running in a web application deploied with Tomcat 6.0.18. The client requests data from a web service and copies the response into a local file. For small responses everything work fine. But if the answer from the web service has a larger size the following exception is thrown.

com.ewerk.epex.md.miner.converter.EpexConverterException: Error converting market data for EPEX Futures Power daily options overview to xml. at com.ewerk.epex.md.miner.converter.xml.futures.EpexFuturesPowerXmlConverter.convertPowerOptionsMarketResults(EpexFuturesPowerXmlConverter.java:158) at com.ewerk.epex.md.miner.transporter.xml.AbstractXmlTransporter.createPowerOptionsMarketResults(AbstractXmlTransporter.java:458) at com.ewerk.eex.shop.backend.modules.scheduler.sysjobs.EpexPowerFuturesXmlTransportJob.doExecute(EpexPowerFuturesXmlTransportJob.java:77) at com.ewerk.eex.shop.backend.modules.scheduler.sysjobs.SystemJobImpl.execute(SystemJobImpl.java:113)
        at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529) Caused by: javax.xml.ws.soap.SOAPFaultException: Error reading XMLStreamReader. at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:145)
        at $Proxy57.dailyOptionsOverview(Unknown Source)
at com.ewerk.epex.md.miner.converter.xml.futures.EpexFuturesPowerXmlConverter.convertPowerOptionsMarketResults(EpexFuturesPowerXmlConverter.java:135)
        ... 5 more
Caused by: org.apache.cxf.binding.soap.SoapFault: Error reading XMLStreamReader. at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:183) at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:56) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:220) at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:633) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:2064) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1942) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1867) at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:47) at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:170) at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66) at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:595) at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:220)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:466)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:299)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:251)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73) at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
        ... 7 more
Caused by: 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:686) 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 com.ctc.wstx.sr.BasicStreamReader.nextTag(BasicStreamReader.java:1095) at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:85)
        ... 24 more

Calling the WebCervice from a different client (Visual Web Service Client) works well, so I guess the problem is on the client side. Using tcpmon I figured out, that the error only occurs if the response is chunked.

here ist spring.xml file for the web service client:
<?xml version="1.0" encoding="UTF-8"?>
<beans       xmlns="http://www.springframework.org/schema/beans";
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
        xmlns:s="http://jax-ws.dev.java.net/spring/core";
        xmlns:jaxws="http://cxf.apache.org/jaxws";
        xmlns:cxf="http://cxf.apache.org/core";
        xmlns:http-conf="http://cxf.apache.org/transports/http/configuration";
        xmlns:context="http://www.springframework.org/schema/context";
        xsi:schemaLocation="http://cxf.apache.org/core
                        http://cxf.apache.org/schemas/core.xsd
                        http://www.springframework.org/schema/beans
                        
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                        http://www.springframework.org/schema/context
                        
http://www.springframework.org/schema/context/spring-context-2.5.xsd
                        http://cxf.apache.org/jaxws
                        http://cxf.apache.org/schemas/jaxws.xsd";>

        <context:component-scan base-package="com.ewerk.epex.md.miner.wsc" />
        
        <!-- EPEX context imports -->
        <import resource="classpath:/spring/epex-core.context.xml"/>
        
        <bean        id="additionalJaxbClassesDetector"
                class="com.ewerk.java.utilities.AnnotatedClassesDetector">
                <property name="basePackage" value="com.ewerk.epex.api" />
<property name="markerAnnotation" value="com.ewerk.epex.core.annotations.AdditionalJaxbClass" />
        </bean>
        <bean        id="additionalJaxbClasses"
                factory-bean="additionalJaxbClassesDetector"
                factory-method="findClassesAsArray" />

        <bean        id="epexFuturesPowerWebServiceClient"
                class="com.ewerk.epex.api.futures.EpexFuturesPowerDomain"
                factory-bean="epexFuturesPowerWebServiceClientFactory"
                factory-method="create" />

        <bean        id="epexFuturesPowerWebServiceClientFactory"
                class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
                <property    name="serviceClass"
                                
value="com.ewerk.epex.api.futures.EpexFuturesPowerDomain" />
<property name="address" value="${build.epex.futures.power.ws.address}" />
                <property name="properties">
                        <map>
                                <entry key="jaxb.additionalContextClasses">
                                        <ref bean="additionalJaxbClasses" />
                                </entry>
                        </map>
                </property>
        </bean>
        
        <bean id="epexFuturesCoalWebServiceClientFactory"
                class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="com.ewerk.epex.api.futures.EpexFuturesCoalDomain" />
                <property name="address" 
value="${test.epex.futures.coal.ws.address}" />
                <property name="properties">
            <map>
                                <entry key="jaxb.additionalContextClasses">
                                        <ref bean="additionalJaxbClasses" />
                                </entry>
            </map>
        </property>
        </bean>
</beans>


and this is spring.xml file for the web service
<?xml version="1.0" encoding="UTF-8"?>
<beans       xmlns="http://www.springframework.org/schema/beans";
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
        xmlns:s="http://jax-ws.dev.java.net/spring/core";
        xmlns:jaxws="http://cxf.apache.org/jaxws";
        xmlns:cxf="http://cxf.apache.org/core";
        xmlns:context="http://www.springframework.org/schema/context";
        xsi:schemaLocation="http://cxf.apache.org/core
                        http://cxf.apache.org/schemas/core.xsd
                        http://www.springframework.org/schema/beans
                        
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                        http://www.springframework.org/schema/context
                        
http://www.springframework.org/schema/context/spring-context-2.5.xsd
                        http://cxf.apache.org/jaxws
                        http://cxf.apache.org/schemas/jaxws.xsd";>

        <!-- CXF imports -->
        <import resource="classpath:META-INF/cxf/cxf.xml"/>
        <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
        <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

        <cxf:bus>
                <cxf:inInterceptors>
                        <ref bean="incomingSoapMonitorInterceptor" />
                </cxf:inInterceptors>
                <cxf:outInterceptors>
                        <ref bean="outgoingSoapMonitorInterceptor" />
                </cxf:outInterceptors>
        </cxf:bus>

        <context:component-scan base-package="com.ewerk.epex.md.provider.ws" />

        <!-- EPEX context imports -->
        <import resource="classpath:/spring/epex-md-provider-dao.context.xml"/>

        <!-- setup DataSource -->
        <bean        id="marketDataDataSource"
                class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <property name="driverClass" value="${build.md.ds.driver}"/>
                <property name="jdbcUrl" value="${build.md.ds.url}"/>
                <property name="user" value="${build.md.ds.user}"/>
                <property name="password" value="${build.md.ds.pass}"/>
<property name="minPoolSize" value="${build.md.ds.min.pool.size}"/> <property name="maxPoolSize" value="${build.md.ds.max.pool.size}"/>
                <property name="acquireIncrement" 
value="${build.md.ds.acq.inc}"/>
            </bean>

        <bean        id="additionalJaxbClassesDetector"
                class="com.ewerk.java.utilities.AnnotatedClassesDetector">
                <property name="basePackage" value="com.ewerk.epex.api" />
<property name="markerAnnotation" value="com.ewerk.epex.core.annotations.AdditionalJaxbClass" />
        </bean>

        <bean        id="additionalJaxbClasses"
                factory-bean="additionalJaxbClassesDetector"
                factory-method="findClassesAsArray" />

        <jaxws:server        id="epexFuturesPowerWebServiceServer"
                        serviceBean="#epexFuturesPowerWebService"
                        address="${build.epex.futures.power.ws.address}">
                 <jaxws:properties>
                        <entry key="jaxb.additionalContextClasses">
                                <ref bean="additionalJaxbClasses" />
                        </entry>
                </jaxws:properties>
        </jaxws:server>
</beans>

For unknown reasons the test classes (testng) for the client did also work well. For the test I create a web service using JaxWsServerFactoryBean.create(). The only difference in the test spring.xml file is that I additionaly defined a bean for the web service and I imported cxf and jetty transport.

        <import resource="classpath:META-INF/cxf/cxf.xml"/>
        <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
        <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
        
        <import resource="classpath:META-INF/cxf/cxf-extension-http-jetty.xml" 
/>

        <bean id="epexFuturesCoalWebServiceServer"
class="com.ewerk.epex.md.provider.ws.futures.EpexFuturesCoalWebService" />

I am grateful for any kind of advice.

Nicolas Wieseke

Reply via email to