java.lang.ClassCastException: java.io.BufferedOutputStream during large message 
transfer
----------------------------------------------------------------------------------------

                 Key: CXF-1058
                 URL: https://issues.apache.org/jira/browse/CXF-1058
             Project: CXF
          Issue Type: Bug
          Components: JAX-WS Runtime
    Affects Versions: 2.0.1
         Environment: Windows XP, Servicemix 3.2, CXF 2.0.1
            Reporter: Ryan Moquin


Returning a large amount of data from a CXF webservice causes the following 
error:

Sep 21, 2007 12:00:29 PM 
org.apache.cxf.transport.jbi.JBIDestinationOutputStream commitOutputMessage
SEVERE: error sending Out message
java.lang.ClassCastException: java.io.BufferedOutputStream
        at 
org.apache.cxf.transport.jbi.JBIDestinationOutputStream.commitOutputMessage(JBIDestinationOutputStream.java:76
)
        at 
org.apache.cxf.transport.jbi.JBIDestinationOutputStream.doClose(JBIDestinationOutputStream.java
 :62)
        at 
org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:119)
        at 
org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
        at 
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage
 (MessageSender
Interceptor.java:62)
        at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:207)
        at org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage( 
OutgoingChainInterceptor.java :73)
        at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:207)
        at 
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:73)
        at 
org.apache.cxf.transport.jbi.JBIDispatcherUtil.dispatch(JBIDispatcherUtil.java:148)
        at 
org.apache.servicemix.cxfse.CxfSeEndpoint.process(CxfSeEndpoint.java:167)
        at org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess 
(AsyncBaseLifeCycle.java:538)

This line of code causes the exception in JBIDestinationOutputStream:
ByteArrayOutputStream baos = (ByteArrayOutputStream)getOut();

Guillaume Nodet has given me an untested patch that he thought might fix the 
issue.  I have written a unittest which performs a write with a large amount of 
data and then attempts to close the stream.  Without the attached patch 
applied, the unit test will fail, but with it applied, the test passes.

The CachedOutputStream class is really a haven for this sort of error since it 
seems that subclasses and invokers of this class seem to be assuming that the 
getOut() method will magically return the correct type of class that they need, 
but there are 3 types that could possibly be returned.  I would also suggest 
that to eliminate future errors, that this class use a ByteBuffer internally 
instead of dynamically manipulating OutputStreams (this would also make more 
sense if this class is meant to cache the data to be written).  It would be 
much easier to use one type consistently in this class rather than several.  
The only problem I can see which this approach (which is why I haven't tried to 
implement it) is the constructor that allows a PipedInputStream.  If you guys 
are interested, I can implement a ByteBuffer internally, change getOut() to 
return a concrete OutputStream class (to eliminate ClassCastExceptions, or it 
could return the DataBuffer) and then write the DataBuffer to a stream when the 
data is to be committed.  This would be easy depending on the PipedInputStream 
in the constructor.  Using a directbuffer would probably make it pretty fast as 
well.

-- 
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