Thanks. I got this to work but got into another trouble.
I followed the wsdl and edited as apt. Here is my own wsdl: <wsdl:definitions name="isServices" xmlns:types="http://services.is/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://services.is" xmlns:jms="http://cxf.apache.org/transports/jms" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" targetNamespace="http://services.is"> <wsdl:types> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://services.is/types" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" elementFormDefault="qualified"> <complexType name="isBinary"> <sequence> <element name="name" type="xsd:string" /> <element name="attachinfo" type="xsd:base64Binary" xmime:expectedContentTypes="application/octet-stream"/> </sequence> </complexType> <element name="isBinary" type="types:isBinaryType"/> </schema> </wsdl:types> <wsdl:message name="sendAttachmentRequest"> <wsdl:part name="data" element="types:isBinary"/> </wsdl:message> <wsdl:portType name="isServicesPortType"> <wsdl:operation name="sendAttachment"> <wsdl:input message="tns:sendAttachmentRequest"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="isServicesBinding" type="tns:isServicesPortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="sendAttachment"> <soap:operation soapAction="http://services.is/sendAttachment" /> <wsdl:input> <soap:body use="literal" /> </wsdl:input> </wsdl:operation> </wsdl:binding> <wsdl:service name="isServices"> <wsdl:port name="isServicesJmsPort" binding="tns:isServicesBinding"> <jms:address destinationStyle="queue" jndiConnectionFactoryName="ConnectionFactory" jndiDestinationName="dynamicQueues/i.s"> <jms:JMSNamingProperty name="java.naming.factory.initial" value="org.apache.activemq.jndi.ActiveMQInitialContextFactory"/> <jms:JMSNamingProperty name="java.naming.provider.url" value="tcp://localhost:61616"/> </jms:address> <jms:client messageType="byte"/> </wsdl:port> </wsdl:service> </wsdl:definitions> Here is my xbean for the JMS consumer: <beans xmlns:cxfbc="http://servicemix.apache.org/cxfbc/1.0" xmlns:is="http://services.is"> <cxfbc:consumer wsdl="classpath:isServices.wsdl" service="is:isServices" targetService="is:isFTPWriter" mtomEnabled="true"/> </beans> Here is the xbean for the target service which I guess is an in-only MEP: <beans xmlns:ftp="http://servicemix.apache.org/ftp/1.0" xmlns:is="http://services.is"> <bean id="myMarshaler" class="org.apache.servicemix.components.util.BinaryFileMarshaler"/> <ftp:sender service="is:isFTPWriter" endpoint="isFTPWriter" uri="ftp://is:i...@localhost/" overwrite="true" uploadSuffix=".dat" marshaler="#myMarshaler"> </ftp:sender> </beans> The project is suppose to achieve the flow below: JMS producer -> JMS Consumer -> NMR -> FTPWriter where JMS producer is the java client code to send binary files Here is the java client code for sending an attachment to the jms consumer String fileName = "file.dat"; byte[] payload = getBytesFromFile(fileName); String dest = "dynamicQueues/i.s"; Properties env = new Properties(); if (System.getProperty("java.naming.provider.url") == null) env.put("java.naming.provider.url", "tcp://localhost:61616"); if (System.getProperty("java.naming.factory.initial") == null) env.put("java.naming.factory.initial", "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); InitialContext ic = new InitialContext(env); ConnectionFactory confac = (ConnectionFactory) ic.lookup("ConnectionFactory"); Connection connection = confac.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer producer = session.createProducer((Destination) ic.lookup(dest)); BytesMessage bm = session.createBytesMessage(); bm.writeBytes(payload); producer.send(bm); connection.close(); However I end up with this exception Aug 5, 2009 11:35:21 AM org.apache.cxf.transport.jms.JMSDestination$JMSExecutor run INFO: run the incoming message in the threadpool Aug 5, 2009 11:35:21 AM org.apache.cxf.phase.PhaseInterceptorChain doIntercept INFO: Interceptor has thrown exception, unwinding now org.apache.cxf.binding.soap.SoapFault: No namespace on "FRAMESET" element.at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handle Message(ReadHeadersInterceptor.java:86) at org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handle Message(ReadHeadersInterceptor.java:54) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseIntercept orChain.java:220) at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainIniti ationObserver.java:78) at org.apache.cxf.transport.jms.JMSDestination.incoming(JMSDestination.j ava:209) at org.apache.cxf.transport.jms.JMSDestination$JMSExecutor.run(JMSDestin ation.java:352) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec utor.java:650) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor .java:675) at java.lang.Thread.run(Thread.java:595) Aug 5, 2009 11:35:21 AM org.apache.cxf.phase.PhaseInterceptorChain doIntercept INFO: Interceptor has thrown exception, unwinding now java.lang.UnsupportedOperationException: A destination must be specified. at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProdu cer.java:195) at org.apache.activemq.ActiveMQQueueSender.send(ActiveMQQueueSender.java :133) at org.apache.cxf.transport.jms.JMSDestination$JMSOutputStream.sendRespo nse(JMSDestination.java:528) at org.apache.cxf.transport.jms.JMSDestination$JMSOutputStream.commitOut putMessage(JMSDestination.java:473) at org.apache.cxf.transport.jms.JMSDestination$JMSOutputStream.doClose(J MSDestination.java:547) at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:16 7) at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:6 6) at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndi ngInterceptor.handleMessage(MessageSenderInterceptor.java:62) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseIntercept orChain.java:220) at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMess age(AbstractFaultChainInitiatorObserver.java:96) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseIntercept orChain.java:260) at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainIniti ationObserver.java:78) at org.apache.cxf.transport.jms.JMSDestination.incoming(JMSDestination.j ava:209) at org.apache.cxf.transport.jms.JMSDestination$JMSExecutor.run(JMSDestin ation.java:352) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec utor.java:650) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor .java:675) at java.lang.Thread.run(Thread.java:595) Freeman Fang wrote: > > Hi, > > A couple of issues in your wsdl > 1. The jms namespace in your wsdl isn't valid for cxf, it should be > http://cxf.apache.org/transports/jms > instead, > 2. Also, the binding part in your wsdl is incorrect, it should use > soap binding, but not jms binding, jms is transport, not binding. > 3. To use mtom, your wsdl should define element with something like > xmime:expectedContentTypes="application/octet-stream" > 4. And the jms:address in your port part is incorrect. > > We have an wsdl example[1] how the wsdl should look like when use soap > binding over jms transport with mtom enabled, and a testcase[2] > which use this wsdl and in this testcase there's a cxf bc consumer > using mtom/soap/jms, I guess you may need take a look at those example. > > [1]https://svn.apache.org/repos/asf/servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/resources/org/apache/servicemix/cxfbc/mtom_xop.wsdl > [2]https://svn.apache.org/repos/asf/servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/CxfBcHttpJmsBridgeMtomTest.java > > Freeman > On 2009-8-4, at 下午8:17, lekkie wrote: > >> >> Hi Freeman, >> >> After following your advice, I got this far. >> >> Here is the exception thrown during deployment of my sa: >> >> Caused by: org.apache.cxf.endpoint.EndpointException >> >> at >> org.apache.cxf.endpoint.EndpointImpl.createBinding(EndpointImpl.java: >> 132) >> >> at org.apache.cxf.endpoint.EndpointImpl.<init>(EndpointImpl.java:81) >> >> at >> org >> .apache.servicemix.cxfbc.CxfBcConsumer.validate(CxfBcConsumer.java: >> 402) >> >> ... 13 more >> >> Caused by: org.apache.cxf.BusException: No binding factory for >> namespace >> http://schemas.sun.com/jbi/wsdl-extensions/jms/ registered. >> >> at >> org >> .apache >> .cxf >> .binding >> .BindingFactoryManagerImpl >> .getBindingFactory(BindingFactoryManagerImpl.java:91) >> >> at >> org.apache.cxf.endpoint.EndpointImpl.createBinding(EndpointImpl.java: >> 129) >> >> ... 15 more >> >> >> >> Here is the content of my wsdl >> >> <?xml version="1.0" encoding="UTF-8"?> >> <definitions name="isJMSConsumer" targetNamespace="http://services.is" >> xmlns="http://schemas.xmlsoap.org/wsdl/" >> xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" >> xmlns:xsd="http://www.w3.org/2001/XMLSchema" >> xmlns:tns="http://services.is" >> xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype" >> xmlns:jms="http://schemas.sun.com/jbi/wsdl-extensions/jms/"> >> <types/> >> <message name="isJMSConsumerOperationRequest"> >> <part name="part1" type="xsd:base64Binary"/> >> </message> >> <portType name="isJMSConsumerPortType"> >> <operation name="isJMSConsumerOperation"> >> <input name="input1" >> message="tns:isJMSConsumerOperationRequest"/> >> </operation> >> </portType> >> <binding name="isJMSConsumerBinding" >> type="tns:isJMSConsumerPortType"> >> <jms:binding/> >> <operation name="isJMSConsumerOperation"> >> <jms:operation destination="Queue/A" >> destinationType="Queue"/> >> <input name="input1"> >> <jms:message messageType="BytesMessage" >> bytesPart="part1" >> forwardAsAttachment="true"/> >> </input> >> </operation> >> </binding> >> <service name="isJMSConsumerService"> >> <port name="isJMSConsumerPort" >> binding="tns:isJMSConsumerBinding"> >> <jms:address connectionURL="mq://localhost:7676"/> >> </port> >> </service> >> <plnk:partnerLinkType name="isJMSConsumer"> >> <plnk:role name="isJMSConsumerPortTypeRole" >> portType="tns:isJMSConsumerPortType"/> >> </plnk:partnerLinkType> >> </definitions> >> >> >> and here is my xbean.xml >> >> <beans xmlns:cxfbc="http://servicemix.apache.org/cxfbc/1.0" >> xmlns:is="http://services.is"> >> >> <!-- wsdlResource="classpath:isFileConsumer.wsdl" --> >> >> <cxfbc:consumer wsdl="classpath:isJMSConsumer.wsdl" >> service="is:isJMSConsumerService" >> targetService="is:isFTPWriter" >> mtomEnabled="true"/> >> </beans> >> >> >> thanks. >> >> >> >> Freeman Fang wrote: >>> >>> Hi, >>> >>> If you want to send attachment over soap with jms transport, could >>> you >>> consider to use the cxf bc component with mtom over jms transport? >>> Freeman >>> >>> On 2009-8-3, at 下午8:02, lekkie wrote: >>> >>>> >>>> >>>> Hi Guys, >>>> >>>> While trying to create a WSDL for my consumer JMS BC on servicemix I >>>> got the >>>> following error >>>> >>>> <loc-message>WSDL is not WS-I BP compliant: [binding >>>> "{http://services.is}isJMSFileConsumerInBinding" : Basic Profile >>>> Violation >>>> #R2401: A wsdl:binding element in a DESCRIPTION MUST use WSDL SOAP >>>> Binding >>>> as defined in WSDL 1.1 Section 3.]</loc-message> >>>> <stack-trace><![CDATA[javax.jbi.management.DeploymentException: WSDL >>>> is not >>>> WS-I BP compliant: [binding "{http:// >>>> services.is}isJMSFileConsumerInBinding" >>>> : Basic Profile Violation #R2401: A wsdl:binding element in a >>>> DESCRIPTION >>>> MUST use WSDL SOAP Binding as defined in WSDL 1.1 Section 3.] >>>> >>>> at >>>> org >>>> .apache >>>> .servicemix >>>> .jms >>>> .endpoints >>>> .JmsSoapConsumerEndpoint.validateWsdl1(JmsSoapConsumerEndpoint.java: >>>> 198) >>>> >>>> at >>>> org >>>> .apache >>>> .servicemix >>>> .jms >>>> .endpoints >>>> .JmsSoapConsumerEndpoint.validate(JmsSoapConsumerEndpoint.java:138) >>>> >>>> While the exception is in itself self explanatory, I ws wondering >>>> what the >>>> best way it is to generate a WSDL. >>>> >>>> Here is the WSDL I generated from Netbeans wizard: >>>> >>>> <?xml version="1.0" encoding="UTF-8"?> >>>> <definitions name="isJMSFileConsumer" >>>> targetNamespace="http://services.is >>>> " >>>> xmlns="http://schemas.xmlsoap.org/wsdl/" >>>> xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" >>>> xmlns:xsd="http://www.w3.org/2001/XMLSchema" >>>> xmlns:tns="http://services.is" >>>> xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype" >>>> xmlns:jms="http://schemas.sun.com/jbi/wsdl-extensions/jms/"> >>>> <types/> >>>> <message name="isJMSFileConsumerInOperationRequest"> >>>> <part name="part1" type="xsd:base64Binary"/> >>>> </message> >>>> <portType name="isJMSFileConsumerInPortType"> >>>> <operation name="isJMSFileConsumerInOperation"> >>>> <input name="input1" >>>> message="tns:isJMSFileConsumerInOperationRequest"/> >>>> </operation> >>>> </portType> >>>> <binding name="isJMSFileConsumerInBinding" >>>> type="tns:isJMSFileConsumerInPortType"> >>>> <jms:binding/> >>>> <operation name="isJMSFileConsumerInOperation"> >>>> <jms:operation destination="DefaultQueue" >>>> destinationType="Queue"/> >>>> <input name="input1"> >>>> <jms:message messageType="BytesMessage" >>>> bytesPart="part1"/> >>>> </input> >>>> </operation> >>>> </binding> >>>> <service name="isJMSFileConsumerIn"> >>>> <port name="isJMSFileConsumerInPortType" >>>> binding="tns:isJMSFileConsumerInBinding"> >>>> <jms:address connectionURL="mq://localhost:61616"/> >>>> </port> >>>> </service> >>>> <plnk:partnerLinkType name="isJMSFileConsumer"> >>>> <!-- A partner link type is automatically generated when a >>>> new port >>>> type is added. Partner link types are used by BPEL processes. >>>> In a BPEL process, a partner link represents the interaction between >>>> the >>>> BPEL process and a partner service. Each partner link is associated >>>> with a >>>> partner link type. >>>> A partner link type characterizes the conversational relationship >>>> between >>>> two services. The partner link type can have one or two roles.--> >>>> <plnk:role name="isJMSFileConsumerInPortTypeRole" >>>> portType="tns:isJMSFileConsumerInPortType"/> >>>> </plnk:partnerLinkType> >>>> </definitions> >>>> >>>> >>>> >>>> And here is the xbean.xml for this service unit >>>> >>>> <beans xmlns:jms="http://servicemix.apache.org/jms/1.0" >>>> xmlns:is="http://services.is" >>>> xmlns:amqpool="http://jencks.org/amqpool/2.0"> >>>> >>>> >>>> <classpath> >>>> <location>.</location> >>>> </classpath> >>>> >>>> <bean id="connectionFactory" >>>> class="org.apache.activemq.pool.PooledConnectionFactory"> >>>> >>>> <property name="connectionFactory"> >>>> <bean >>>> class="org.apache.activemq.ActiveMQConnectionFactory"> >>>> <property name="brokerURL" value="tcp://localhost: >>>> 61616" /> >>>> </bean> >>>> </property> >>>> >>>> <!--Configure maximum connections used by the pool --> >>>> <property name="maxConnections" value="10" /> >>>> >>>> <!--Configure maximum sessions per connection --> >>>> <property name="maximumActive" value="10" /> >>>> </bean> >>>> >>>> <!-- add the sender endpoint here --> >>>> <bean id="myMarshaler" >>>> class="org.apache.servicemix.components.util.BinaryFileMarshaler"/> >>>> >>>> <jms:soap-consumer service="is:isJMSFileConsumer" >>>> endpoint="isJMSFileConsumer" >>>> wsdl="classpath:isJMSFileConsumer.wsdl" >>>> validateWsdl="true" >>>> targetService="is:isFTPWriter" >>>> destinationName="queue/A/Soap" >>>> connectionFactory="#connectionFactory"/> >>>> </beans> >>>> >>>> What is the best way to generate a WSDL for a binary message >>>> (attachment) >>>> through JMS BC over SOAP? >>>> >>>> kr. >>>> -- >>>> View this message in context: >>>> http://www.nabble.com/Binary-Message-WSDL-for-JMS-BC-%28Consumer%29-tp24789561p24789561.html >>>> Sent from the ServiceMix - User mailing list archive at Nabble.com. >>>> >>> >>> >>> -- >>> Freeman Fang >>> ------------------------ >>> Open Source SOA: http://fusesource.com >>> >>> >>> >> >> -- >> View this message in context: >> http://www.nabble.com/Binary-Message-WSDL-for-JMS-BC-%28Consumer%29-tp24789561p24807302.html >> Sent from the ServiceMix - User mailing list archive at Nabble.com. >> > > > -- > Freeman Fang > ------------------------ > Open Source SOA: http://fusesource.com > > > -- View this message in context: http://www.nabble.com/Binary-Message-WSDL-for-JMS-BC-%28Consumer%29-tp24789561p24824802.html Sent from the ServiceMix - User mailing list archive at Nabble.com.
