when deal with a response header,  an  infinite loop occurs
-----------------------------------------------------------

                 Key: CAMEL-987
                 URL: https://issues.apache.org/activemq/browse/CAMEL-987
             Project: Apache Camel
          Issue Type: Bug
    Affects Versions: 1.4.0
         Environment: operating system: windows 2000
software platform: apache-camel-1.4.0 + apache-cxf-2.1.1
            Reporter: Sky Wang
         Attachments: camel-context.xml, sre.wsdl

I use apache-camel-1.4.0 and apache-cxf-2.1.1 in my application. 
My application is a web service application.Which receive a soap header + soap 
body, and then response a soap header + soap body. 

I use WSDLToJava tool to create the java code from wsdl, it creates an 
interface for me as follow: 

@WebService(targetNamespace = "http://com.aspire/";, name = "SreServicePortType")
@XmlSeeAlso({aspire.com.xsd.ObjectFactory.class})
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)

public interface SreServicePortType {

/*
 * 
 */

    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
    @WebMethod
    public void serviceContentFetchReq(
        @WebParam(partName = "request", name = "serviceContentFetchReq", 
targetNamespace = "http://com.aspire/xsd";)
        aspire.com.xsd.ServiceContentFetchReq request,
        @WebParam(partName = "requestHeader", name = "serviceHeader", 
targetNamespace = "http://com.aspire/xsd";, header = true)
        aspire.com.xsd.ServiceHeader requestHeader,
        @WebParam(partName = "response", mode = WebParam.Mode.OUT, name = 
"serviceContentFetchReqResponse", targetNamespace = "http://com.aspire/xsd";)
        javax.xml.ws.Holder<aspire.com.xsd.ServiceContentFetchReqResponse> 
response,
        @WebParam(partName = "responseHeader", mode = WebParam.Mode.OUT, name = 
"serviceHeader", targetNamespace = "http://com.aspire/xsd";, header = true)
        javax.xml.ws.Holder<aspire.com.xsd.ServiceHeader> responseHeader
    );
}

Then, I implement the routing rules in the xml file:

        <process ref="ipValidateProcessor" />
        <choice>
            <when>
                 <!-- First predicate -->
                 <el>${in.headers.IP_VALIDATE_RESULT == 'true'}</el>
                 <to uri="cxf:bean:serviceEndpoint" />
                 <process ref="responseProcessor" />
            </when>
           <otherwise>
                  <process ref="invalidIPProcessor" />
           </otherwise>
     </choice>

In the ipValidateProcessor,  I set  in.headers.IP_VALIDATE_RESULT = false, so 
the invalidIPProcessor will run.In the invalidIPProcessor,  I only need set 
response body and response header.
I have traced the exchange object in the processor, the exchange.out element is 
null, and the exchange.in element is a CxfMessage object. The exchange.in.body 
element is a MessageContentList object: Object[0] is a ServiceContentFetchReq , 
Object[1] is a ServiceHeader, Object[2] is a Holder<T>, Object[3] is a 
Holder<T>. 

So i put response body into Object[2], and put response header into Object[3]: 

               org.apache.camel.Message in = exchange.getIn(); 
          List inBody = (List) in.getBody(); 
          Holder holderBody = (Holder)inBody.get(2); 
          holderBody .value = body;// body is a ServiceContentFetchReqResponse 
object 
               Holder holderHeader = (Holder)inBody.get(3); 
          holderHeader .value = header;//header is a ServiceHeader object 

But, when I run the application, I got an Exception:java.lang.OutOfMemoryError: 
Java heap space. 
I debuged into program, there is an Infinite Loop occured at the 
org.apache.cxf.jaxws.interceptors.HolderOutInterceptor(72): 

                for (int x = 0; x < inObjects.size(); x++) { 
                    Object o = inObjects.get(x); 
                    if (o instanceof Holder) { 
                        outObjects.set(x + 1, o); 
                    } 
                } 

I have traced and found: inObjects == outObjects is true, which leads to an 
Infinite Loop. 

Stack trace: 

2008-10-14 9:40:19 sun.reflect.NativeMethodAccessorImpl invoke0 
严重: EXCEPTION 
java.lang.OutOfMemoryError: Java heap space 
2008-10-14 9:40:19 org.apache.cxf.phase.PhaseInterceptorChain doIntercept 
信息: Interceptor has thrown exception, unwinding now 
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:54)
 
at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
 
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:449) 
at 
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1996)
 
at 
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1832)
 
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66) 
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:591) 
at 
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
 
at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:296) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:242) 
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73) 
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:178) 
at $Proxy48.serviceContentFetchReq(Unknown Source) 
at com.aspire.archtype.camel.Client.invoke(Client.java:77) 
at com.aspire.archtype.camel.spring.Main.main(Main.java:19) 
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: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 com.ctc.wstx.sr.BasicStreamReader.nextTag(BasicStreamReader.java:1095) 
at 
org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:83)
 
... 16 more 
javax.xml.ws.soap.SOAPFaultException: Error reading XMLStreamReader. 
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:199) 
at $Proxy48.serviceContentFetchReq(Unknown Source) 
at com.aspire.archtype.camel.Client.invoke(Client.java:77) 
at com.aspire.archtype.camel.spring.Main.main(Main.java:19) 
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:54)
 
at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
 
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:449) 
at 
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1996)
 
at 
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1832)
 
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66) 
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:591) 
at 
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
 
at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:296) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:242) 
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73) 
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:178) 
... 3 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: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 com.ctc.wstx.sr.BasicStreamReader.nextTag(BasicStreamReader.java:1095) 
at 
org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:83)
 
... 16 more 


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to