Wasn't aware of that feature. Just what I need. Thanks a lot!!! On Thu, Apr 22, 2010 at 12:08 PM, Daniel Kulp <[email protected]> wrote:
> On Thursday 22 April 2010 12:00:16 pm Thomas Koenig wrote: > > Thanks for the quick reply. > > > > So, is there any other way that MTOM attachments are made available > through > > the Dispatch SPI (i.e. I don't want to do JAXB data binding). > > Normally, you would add a field like: > > @Resource > WebServiceContext ctx; > > which CXF would inject in. In your invoke method, you would do: > > ctx.getMessageContext().get(MessageContext.INBOUND_MESSAGE_ATTACHMENTS); > > which would return a java.util.Map<String,DataHandler>. From that map, > you > could map the xop include hrefs to the appropriate DataHandler in the Map. > Again this is by FAR the most efficient way to do this. It's a bit more > work for the Provider writer, but it performance is a ton better. > > Dan > > > > > > On Thu, Apr 22, 2010 at 11:45 AM, Daniel Kulp <[email protected]> wrote: > > > > I had hoped that the Apache runtime would process the attachment and > > > > > > inline > > > > > > > it into the > > > > 'DOMSource request' before the 'invoke' method is called, but it > > > > appears that no mtom > > > > processing takes place. > > > > > > Well, the main reason we don't do this is that in many cases we > COULDN'T > > > do it > > > without a ton of memory available and it also would be extremely > > > inefficient > > > for most use cases. At some point, I do think we COULD wrapper the > > > XMLStreamReader with one that would do the mtom processing, but that > > > would half to be made optional somehow. > > > > > > For example, lets pretend your attachment is a 500MB file. With the > > > current > > > setup, you would have the WebServiceContext injected where you could > get > > > the > > > Attachment and an input stream to get the raw data. That input stream > > > would > > > be a wrapper to the raw HttpInputStream so the data would be streamed > in > > > not > > > consuming any memory and not involving any processor time to encode and > > > such. > > > > > > If we processed it, we would need to pull the 500MB in, run a base64 > > > encode on > > > it to create a base64 string (which, since it's unicode, would take > 1.3GB > > > of > > > memory) to add to the DOM. To use that data, you would NORMALLY then > > > decode > > > it back to the byte[] data thus wasting more cpu time. > > > > > > Dan > > > > > > On Thursday 22 April 2010 11:29:55 am Thomas Koenig wrote: > > > > Is MTOM attachment handling supported through the Dispatch SPI? > > > > > > > > I have modified the jaxws_dispatch_provider CXF sample, to > accept/send > > > > payloads that contain Base64Binary data. > > > > > > > > > ####################################################################### > > > > Schema: > > > > ####### > > > > <complexType name="DocumentDetailType"> > > > > > > > > <sequence> > > > > > > > > <element name="identifier" type="xsd:string"/> > > > > <element name="content" type="xsd:base64Binary"/> > > > > > > > > </sequence> > > > > > > > > </complexType> > > > > > > > > <complexType name="DocumentType"> > > > > > > > > <sequence> > > > > > > > > <element name="name" type="xsd:string"/> > > > > <element name="id" type="xsd:string"/> > > > > <element name="detail" type="types:DocumentDetailType"/> > > > > > > > > </sequence> > > > > > > > > </complexType> > > > > > > > > <element name="testDocumentRequest" type="types:DocumentType" /> > > > > <element name="testDocumentResponse" type="types:DocumentType" /> > > > > > ####################################################################### > > > > > > > > > > > > > ####################################################################### > > > > Request Message sample: > > > > ####### > > > > ------=_Part_4_8271067.1271948982000 > > > > Content-Type: application/xop+xml; charset=UTF-8; type="text/xml" > > > > Content-Transfer-Encoding: 8bit > > > > Content-ID: <[email protected]> > > > > > > > > <soapenv:Envelope xmlns:soapenv=" > > > > > > http://schemas.xmlsoap.org/soap/envelope/" > > > > > > > xmlns:typ="http://cxf.apache.org/mime/types"> > > > > > > > > <soapenv:Header/> > > > > <soapenv:Body> > > > > > > > > <typ:testDocument> > > > > > > > > <typ:name>RequestSOAPUI_01</typ:name> > > > > <typ:id>RequestSOAPUI_01_id</typ:id> > > > > <typ:detail> > > > > > > > > > <typ:identifier>RequestSOAPUI_01_identifier</typ:identifier > > > > > <typ:content><inc:Include href="cid:217539756627" > > > > xmlns:inc=" > > > > > > > > http://www.w3.org/2004/08/xop/include"/></typ:content> > > > > > > > > </typ:detail> > > > > > > > > </typ:testDocument> > > > > > > > > </soapenv:Body> > > > > > > > > </soapenv:Envelope> > > > > ------=_Part_4_8271067.1271948982000 > > > > Content-Type: text/xml; charset=us-ascii > > > > Content-Transfer-Encoding: 7bit > > > > Content-ID: <217539756627> > > > > > > > > PGE+DQogIDxiIG5hbWU9IlRob21hcyIvPg0KPGE+ > > > > ------=_Part_4_8271067.1271948982000-- > > > > > ####################################################################### > > > > > > > > > > > > > ####################################################################### > > > > Apache CXF dispatch provider: > > > > ####### > > > > @MTOM(threshold = 0, enabled = true) > > > > @WebServiceProvider( > > > > > > > > portName = "TestDocumentPort", > > > > serviceName = "TestDocumentService", > > > > targetNamespace = "http://cxf.apache.org/mime", > > > > wsdlLocation = "wsdl/mtom_xop.wsdl") > > > > > > > > @ServiceMode(value = Service.Mode.MESSAGE) > > > > public class TestDocumentDomSourceMessageProvider implements > > > > Provider<DOMSource> { > > > > > > > > public TestDocumentDomSourceMessageProvider() { > > > > } > > > > > > > > public DOMSource invoke(DOMSource request) { > > > > > > > > DOMSource response = new DOMSource(); > > > > try { > > > > > > > > MessageFactory factory = MessageFactory.newInstance(); > > > > SOAPMessage soapReq = factory.createMessage(); > > > > soapReq.getSOAPPart().setContent(request); > > > > > > > > System.out.println("Incoming Client Request as a > DOMSource > > > > > > data > > > > > > > in MESSAGE Mode"); > > > > > > > > soapReq.writeTo(System.out); > > > > System.out.println("\n"); > > > > > > > > InputStream is = > > > > > > > > getClass().getResourceAsStream("TestDocumentResponse.xml"); > > > > > > > > SOAPMessage testDocumentResponse = > > > > > > factory.createMessage(null, > > > > > > > is); > > > > > > > > is.close(); > > > > > > > > response.setNode(testDocumentResponse.getSOAPPart()); > > > > > > > > } catch (Exception ex) { > > > > > > > > ex.printStackTrace(); > > > > > > > > } > > > > return response; > > > > > > > > } > > > > > > > > } > > > > > > > > Object implementor = new TestDocumentDomSourceMessageProvider(); > > > > String address = "http://localhost:9000/document-test"; > > > > Endpoint ep = Endpoint.publish(address, implementor); > > > > ((SOAPBinding)ep.getBinding()).setMTOMEnabled(true); > > > > > > > #######################################################################xm > > > ln > > > > > > > s:soapenv=" http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ=" > > > > http://cxf.apache.org/mime/types"> > > > > > > > > I had hoped that the Apache runtime would process the attachment and > > > > > > inline > > > > > > > it into the > > > > 'DOMSource request' before the 'invoke' method is called, but it > > > > appears that no mtom > > > > processing takes place. > > > > > > -- > > > Daniel Kulp > > > [email protected] > > > http://dankulp.com/blog > > -- > Daniel Kulp > [email protected] > http://dankulp.com/blog >
