I think you are still picking up an older version of CXF from someplace. The stack trace you have below is impossible with the newer code.
> at org.apache.cxf.helpers.IOUtils.copy(IOUtils.java:75) > at > org.apache.cxf.attachment.AttachmentDataSource.<init>(AttachmentDataSource. >java:39) at That's older code. Neither of the constructors of AttachmentDataSource call IOUtils anymore. Line 39 is just: this.ct = ctParam; I'd double check your libs. Dan On Thu July 30 2009 4:48:40 am dp-isp wrote: > I tried the 2.2.3 release candidate as you suggested with the same > implementation of my first post, but nothing changes. I also explicitly > disabled schema-validation inside cxf.xml of the service (even if it should > be the default if I well understood.) > Is there a subversion URL or something similar, where I can get diffs > between version? > > > This is the thread dump on JBoss where the servlet (WS client) is deployed > on. In that moment this thread is actually downloading the file from the WS > server a caching it in /tmp/cxf-tmp-960634/cos44564tmp: > > "http-dev-jboss3-dspstd.csi.it%2F10.102.40.71-13610-1" daemon prio=1 > tid=0x0837c568 nid=0x2bcc runnable [0x7ec8c000..0x7ec8dda0] > at java.net.SocketInputStream.socketRead0(Native Method) > at java.net.SocketInputStream.read(SocketInputStream.java:129) > at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) > at java.io.BufferedInputStream.read1(BufferedInputStream.java:256) > at java.io.BufferedInputStream.read(BufferedInputStream.java:313) > - locked <0xaabfa010> (a java.io.BufferedInputStream) > at > sun.net.www.http.ChunkedInputStream.fastRead(ChunkedInputStream.java:221) > at > sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:662) > - locked <0xaabfc9c8> (a sun.net.www.http.ChunkedInputStream) > at java.io.FilterInputStream.read(FilterInputStream.java:111) > at > sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLCon >nection.java:2172) at > java.io.FilterInputStream.read(FilterInputStream.java:111) at > java.io.PushbackInputStream.read(PushbackInputStream.java:161) at > org.apache.cxf.attachment.MimeBodyPartInputStream.read(MimeBodyPartInputStr >eam.java:74) at java.io.InputStream.read(InputStream.java:89) > at > org.apache.cxf.attachment.DelegatingInputStream.read(DelegatingInputStream. >java:77) at org.apache.cxf.helpers.IOUtils.copy(IOUtils.java:112) > at org.apache.cxf.helpers.IOUtils.copy(IOUtils.java:75) > at > org.apache.cxf.attachment.AttachmentDataSource.<init>(AttachmentDataSource. >java:39) at > org.apache.cxf.attachment.AttachmentUtil.createAttachment(AttachmentUtil.ja >va:168) at > org.apache.cxf.attachment.AttachmentDeserializer.createAttachment(Attachmen >tDeserializer.java:283) at > org.apache.cxf.attachment.AttachmentDeserializer.readNext(AttachmentDeseria >lizer.java:194) at > org.apache.cxf.attachment.LazyAttachmentCollection$1.hasNext(LazyAttachment >Collection.java:73) at > org.apache.cxf.attachment.LazyDataSource.load(LazyDataSource.java:49) > - locked <0xaac08660> (a org.apache.cxf.attachment.LazyDataSource) > at > org.apache.cxf.attachment.LazyDataSource.getContentType(LazyDataSource.java >:59) at javax.activation.DataHandler.<init>(DataHandler.java:44) at > org.apache.cxf.jaxb.attachment.JAXBAttachmentUnmarshaller.getAttachmentAsDa >taHandler(JAXBAttachmentUnmarshaller.java:55) at > com.sun.xml.bind.v2.runtime.unmarshaller.MTOMDecorator.startElement(MTOMDec >orator.java:96) at > com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartEle >ment(StAXStreamConnector.java:275) at > com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStr >eamConnector.java:209) at > com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unmars >hallerImpl.java:360) at > com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unmarsh >allerImpl.java:339) at > org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:6 >07) at > org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:5 >27) at > org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:114) > at > org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteral >InInterceptor.java:99) at > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChai >n.java:236) - locked <0xaabffa20> (a > org.apache.cxf.phase.PhaseInterceptorChain) at > org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:645) at > org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRespons >eInternal(HTTPConduit.java:2132) at > org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRespons >e(HTTPConduit.java:2015) at > org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPCon >duit.java:1940) at > org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66) > at > org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:627) > at > org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInte >rceptor.handleMessage(MessageSenderInterceptor.java:62) at > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChai >n.java:236) - locked <0xaabda040> (a > org.apache.cxf.phase.PhaseInterceptorChain) at > org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:471) at > org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:301) at > org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:253) at > org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73) > at > org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:121) > at $Proxy338.downloadMethod(Unknown Source) > at > it.csi.mtomsample.streamingclient.presentation.wsclient.DownloadServletBrow >ser.doPost(Unknown Source) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applicatio >nFilterChain.java:290) at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterC >hain.java:206) at > org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.j >ava:96) at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applicatio >nFilterChain.java:235) at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterC >hain.java:206) at > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.j >ava:230) at > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.j >ava:175) at > org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssoc >iationValve.java:179) at > org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java >:84) at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:12 >8) at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:10 >4) at > org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnect >ionValve.java:157) at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.jav >a:109) at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241) > at > org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) > at > org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Htt >p11Protocol.java:580) at > org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) > at java.lang.Thread.run(Thread.java:595) > > > > This is the thread dump on WebLogic where the WS service is deployed on. In > that moment this thread is actually providing the file to the client. > > > "[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default > (self-tuning)'" id=17 idx=0x5c tid=17758 prio=5 alive, in native, daemon > at > jrockit/net/SocketNativeIO.writeBytesPinned(Ljava/io/FileDescriptor;[BII)V( >Native Method) > at jrockit/net/SocketNativeIO.socketWrite(SocketNativeIO.java:45) > at > java/net/SocketOutputStream.socketWrite0(Ljava/io/FileDescriptor;[BII)V(Soc >ketOutputStream.java) at > java/net/SocketOutputStream.socketWrite(SocketOutputStream.java:92) at > java/net/SocketOutputStream.write(SocketOutputStream.java:136) at > weblogic/servlet/internal/ChunkOutput.writeChunkTransfer(ChunkOutput.java:5 >25) at > weblogic/servlet/internal/ChunkOutput.writeChunks(ChunkOutput.java:504) > at weblogic/servlet/internal/ChunkOutput.flush(ChunkOutput.java:382) > at > weblogic/servlet/internal/CharsetChunkOutput.flush(CharsetChunkOutput.java: >249) at > weblogic/servlet/internal/ChunkOutput.checkForFlush(ChunkOutput.java:469) > at > weblogic/servlet/internal/CharsetChunkOutput.implWrite(CharsetChunkOutput.j >ava:396) at > weblogic/servlet/internal/CharsetChunkOutput.write(CharsetChunkOutput.java: >198) at > weblogic/servlet/internal/ChunkOutputWrapper.write(ChunkOutputWrapper.java: >133) at > weblogic/servlet/internal/ServletOutputStreamImpl.write(ServletOutputStream >Impl.java:169) at > org/apache/cxf/io/AbstractWrappedOutputStream.write(AbstractWrappedOutputSt >ream.java:46) at javax/activation/DataHandler.writeTo(DataHandler.java:290) > at > org/apache/cxf/attachment/AttachmentSerializer.writeAttachments(AttachmentS >erializer.java:153) at > org/apache/cxf/interceptor/AttachmentOutInterceptor$AttachmentOutEndingInte >rceptor.handleMessage(AttachmentOutInterceptor.java:80) at > org/apache/cxf/phase/PhaseInterceptorChain.doIntercept(PhaseInterceptorChai >n.java:236) ^-- Holding lock: > org/apache/cxf/phase/phaseinterceptorch...@0x102dafd8[thin lock] > at > org/apache/cxf/interceptor/OutgoingChainInterceptor.handleMessage(OutgoingC >hainInterceptor.java:74) at > org/apache/cxf/phase/PhaseInterceptorChain.doIntercept(PhaseInterceptorChai >n.java:236) ^-- Holding lock: > org/apache/cxf/phase/phaseinterceptorch...@0x102cef90[thin lock] > at > org/apache/cxf/transport/ChainInitiationObserver.onMessage(ChainInitiationO >bserver.java:89) at > org/apache/cxf/transport/servlet/ServletDestination.invoke(ServletDestinati >on.java:99) at > org/apache/cxf/transport/servlet/ServletController.invokeDestination(Servle >tController.java:368) at > org/apache/cxf/transport/servlet/ServletController.invoke(ServletController >.java:183) at > org/apache/cxf/transport/servlet/AbstractCXFServlet.invoke(AbstractCXFServl >et.java:163) at > org/apache/cxf/transport/servlet/AbstractCXFServlet.doPost(AbstractCXFServl >et.java:141) at javax/servlet/http/HttpServlet.service(HttpServlet.java:763) > at javax/servlet/http/HttpServlet.service(HttpServlet.java:856) at > weblogic/servlet/internal/StubSecurityHelper$ServletServiceAction.run(StubS >ecurityHelper.java:227) at > weblogic/servlet/internal/StubSecurityHelper.invokeServlet(StubSecurityHelp >er.java:125) at > weblogic/servlet/internal/ServletStubImpl.execute(ServletStubImpl.java:283) > at > weblogic/servlet/internal/ServletStubImpl.execute(ServletStubImpl.java:175) > at > weblogic/servlet/internal/WebAppServletContext$ServletInvocationAction.run( >WebAppServletContext.java:3231) at > weblogic/security/acl/internal/AuthenticatedSubject.doAs(AuthenticatedSubje >ct.java:321) at > weblogic/security/service/SecurityManager.runAs(SecurityManager.java:121) > at > weblogic/servlet/internal/WebAppServletContext.securedExecute(WebAppServlet >Context.java:2002) at > weblogic/servlet/internal/WebAppServletContext.execute(WebAppServletContext >.java:1908) at > weblogic/servlet/internal/ServletRequestImpl.run(ServletRequestImpl.java:13 >62) at weblogic/work/ExecuteThread.execute(ExecuteThread.java:209) at > weblogic/work/ExecuteThread.run(ExecuteThread.java:181) > at jrockit/vm/RNI.c2java(IIIII)V(Native Method) > -- end of trace > > > Bye, > Marco > > dkulp wrote: > > On Wed July 29 2009 5:30:13 am dp-isp wrote: > >> Sorry if my question is trivial... in order to test your fixes, can I > >> download the latest snapshot > >> (http://repository.apache.org/snapshots/org/apache/cxf/apache-cxf/2.2.3- > >>SNA PSHOT/) or there is a better way? > > > > Yea. But testing out the actual 2.2.3 release candidate that we are > > voting on > > would be good as well: > > https://repository.apache.org/content/repositories/cxf-staging-003/org/ap > >ache/cxf/apache-cxf/2.2.3 > > > > Dan > > > >> Thanks, > >> Marco > >> > >> dkulp wrote: > >> > Well, I THOUGHT this would have been easily doable, but when I > >> > checked, it turns out the attachments were not streaming properly in > >> > MTOM mode. > >> > > >> > :-( > >> > > >> > I've gone through and fixed a BUNCH of things related to the > >> > attachment handling and streaming and such so some of this is now > >> > possible. > >> > > >> > Now, with the latest code, when you get the DataSource, if at all > >> > possible, > >> > the input stream that is returned will properly be streaming off the > >> > >> wire > >> > >> > instead of cached. Thus, you can copy directly from there to the > >> > >> output > >> > >> > stream. > >> > > >> > There are cases where this WON'T work stream directly, notably when > >> > schema validation is turned on. In that case, to work around issues > >> > >> in > >> > >> > JAXB, we buffer the content. Also, if there are multiple > >> > >> attachments, > >> > >> > only the last > >> > one can really be streamed this way. The others get buffered. > >> > > >> > Dan > >> > > >> > On Mon July 27 2009 5:50:00 am dp-isp wrote: > >> >> Hello everybody, > >> >> > >> >> We have a CXF webservice that is a kind of "repository service" and a > >> >> webapp working as frontend for that repository. > >> >> Those two components are on separate hosts. > >> >> > >> >> We would need to realize a continuous stream of data when downloading > >> >> attachments from CXF webservice to the users' browser through the > >> >> frontend > >> >> webapp. > >> >> > >> >> The webapp is basically a servlet that invokes the webservice, > >> > >> receives > >> > >> >> the > >> >> attachment datahandler and copies datahandler InputStream to servlet > >> >> response OutputStream (servlet code is at the end of this email). > >> >> > >> >> Our issue: is it possible to directly link datahandler InputStream to > >> >> servlet response OutputStream without re-building the whole > >> >> attachment in memoroy or in a temporary file? (as can be configured > >> >> by setting org.apache.cxf.io.CachedOutputStream.Threshold, > >> >> org.apache.cxf.io.CachedOutputStream.OutputDirectory) > >> >> > >> >> Going more into details, is there a way to send to CXF the output > >> > >> buffer > >> > >> >> to > >> >> write the attachment on? In such case we would send to CXF the > >> > >> sevlet's > >> > >> >> output buffer. > >> >> > >> >> Alternatively, is there a way to manage CXF working asynchronously > >> > >> with > >> > >> >> attachments, giving back control to the servlet before attachment > >> >> downolad > >> >> completion? > >> >> > >> >> Many thanks, > >> >> Marco > >> >> > >> >> --- > >> >> > >> >> This is the servlet's involved code: > >> >> > >> >> ... > >> >> StreamingService_Service ss = new StreamingService_Service(new > >> >> URL(serviceURL)); > >> >> StreamingService port = ss.getServiceImplPort(new MTOMFeature()); > >> >> > >> >> Resume myFile = port.downloadMethod(fileName, fileType, usr, pwd, > >> > >> repo); > >> > >> >> DataHandler handler = myFile.getResume(); > >> >> > >> >> response.setHeader("Pragma", "No-cache"); > >> >> response.setContentType("application/octet-stream"); > >> >> response.setHeader("content-disposition", "attachment; filename=" + > >> >> fileName + "." + fileType); > >> >> try { > >> >> InputStream is = handler.getInputStream(); > >> >> try { > >> >> OutputStream os = response.getOutputStream(); > >> >> try { > >> >> byte[] b = new byte[100000]; > >> >> int bytesRead = 0; > >> >> while ((bytesRead = is.read(b)) != -1) { > >> >> os.write(b, 0, bytesRead); > >> >> } > >> >> System.out.println("Download del file " + > >> >> myFile.getCandidateName() > >> > >> + > >> > >> >> "." + myFile.getResumeFileType() + " completato."); > >> >> } finally { > >> >> os.flush(); > >> >> os.close(); > >> >> } > >> >> } finally { > >> >> is.close(); > >> >> } > >> >> > >> >> } catch (Exception e) { > >> >> e.printStackTrace(); > >> >> } > >> >> ... > >> > > >> > -- > >> > Daniel Kulp > >> > [email protected] > >> > http://www.dankulp.com/blog > > > > -- > > Daniel Kulp > > [email protected] > > http://www.dankulp.com/blog -- Daniel Kulp [email protected] http://www.dankulp.com/blog
