I need to design a Mule flow with xml file as input to a JMS queue. Once in queue it will be picked up to hit a SOAP web service. Following is a code.
<jms:activemq-connector name="Active_MQ" brokerURL="tcp://localhost:61616" validateConnections="true" doc:name="Active MQ"/>
<flow name="jmsFlow2" doc:name="jmsFlow2">
<file:inbound-endpoint responseTimeout="10000" doc:name="File" path="D:\Input"/>
<byte-array-to-string-transformer doc:name="Byte Array to String"/>
<jms:outbound-endpoint queue="DimQueue" connector-ref="Active_MQ" doc:name="JMS" mimeType="text/plain"/>
</flow>
<flow name="jmsFlow1" doc:name="jmsFlow1">
<jms:inbound-endpoint queue="DimQueue" connector-ref="Active_MQ" doc:name="JMS"/>
<jms:jmsmessage-to-object-transformer doc:name="JMSMessage to Object"/>
<logger message="#[message.payload]" level="INFO" doc:name="Logger"/>
<!-- <mulexml:object-to-xml-transformer doc:name="Object to XML"/> -->
<logger message="#[message.payload]" level="INFO" doc:name="Logger"/>
<set-property propertyName="Content-Type" value="application/soap+xml" doc:name="Property"/>
<logger message="#[message.outboundProperties]-------#[header:Content-Type]" level="INFO" doc:name="Logger"/>
<cxf:jaxws-service serviceClass="com.org.ProcessImpl" doc:name="SOAP" enableMuleSoapHeaders="false" mtomEnabled="true">
</cxf:jaxws-service>
<http:outbound-endpoint exchange-pattern="request-response" host="localhost" port="9090" method="POST" doc:name="HTTP">
</http:outbound-endpoint>
</flow>
It gives following error:
WARN 2014-02-06 15:27:23,145 [[jms].jmsFlow1.stage1.02]org.apache.cxf.phase.PhaseInterceptorChain: Interceptor for {http://com.capgemini/cif/dim}ProcessActivityService has thrown exception, unwinding now
org.apache.cxf.binding.soap.SoapFault: Missing ContentType.
at org.apache.cxf.binding.soap.jms.interceptor.SoapFaultFactory.createSoap11Fault(SoapFaultFactory.java:58)
at org.apache.cxf.binding.soap.jms.interceptor.SoapFaultFactory.createFault(SoapFaultFactory.java:48)
at org.apache.cxf.binding.soap.jms.interceptor.SoapJMSInInterceptor.createFault(SoapJMSInInterceptor.java:226)
at org.apache.cxf.binding.soap.jms.interceptor.SoapJMSInInterceptor.checkContentType(SoapJMSInInterceptor.java:191)
at org.apache.cxf.binding.soap.jms.interceptor.SoapJMSInInterceptor.handleMessage(SoapJMSInInterceptor.java:49)
at org.apache.cxf.binding.soap.jms.interceptor.SoapJMSInInterceptor.handleMessage(SoapJMSInInterceptor.java:38)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:122)
at org.mule.module.cxf.CxfInboundMessageProcessor.sendToDestination(CxfInboundMessageProcessor.java:320)
at org.mule.module.cxf.CxfInboundMessageProcessor.process(CxfInboundMessageProcessor.java:142)
at org.mule.module.cxf.config.FlowConfiguringMessageProcessor.process(FlowConfiguringMessageProcessor.java:52)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:95)
at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
at org.mule.processor.AbstractInterceptingMessageProcessorBase.processNext(AbstractInterceptingMessageProcessorBase.java:106)
at org.mule.interceptor.AbstractEnvelopeInterceptor.process(AbstractEnvelopeInterceptor.java:55)
at org.mule.processor.AsyncInterceptingMessageProcessor.processNextTimed(AsyncInterceptingMessageProcessor.java:122)
at org.mule.processor.AsyncInterceptingMessageProcessor$AsyncMessageProcessorWorker$1.process(AsyncInterceptingMessageProcessor.java:192)
at org.mule.processor.AsyncInterceptingMessageProcessor$AsyncMessageProcessorWorker$1.process(AsyncInterceptingMessageProcessor.java:185)
at org.mule.execution.ExecuteCallbackInterceptor.execute(ExecuteCallbackInterceptor.java:20)
at org.mule.execution.HandleExceptionInterceptor.execute(HandleExceptionInterceptor.java:34)
at org.mule.execution.HandleExceptionInterceptor.execute(HandleExceptionInterceptor.java:18)
at org.mule.execution.BeginAndResolveTransactionInterceptor.execute(BeginAndResolveTransactionInterceptor.java:58)
at org.mule.execution.ResolvePreviousTransactionInterceptor.execute(ResolvePreviousTransactionInterceptor.java:48)
at org.mule.execution.SuspendXaTransactionInterceptor.execute(SuspendXaTransactionInterceptor.java:54)
at org.mule.execution.ValidateTransactionalStateInterceptor.execute(ValidateTransactionalStateInterceptor.java:44)
at org.mule.execution.IsolateCurrentTransactionInterceptor.execute(IsolateCurrentTransactionInterceptor.java:44)
at org.mule.execution.ExternalTransactionInterceptor.execute(ExternalTransactionInterceptor.java:52)
at org.mule.execution.RethrowExceptionInterceptor.execute(RethrowExceptionInterceptor.java:32)
at org.mule.execution.RethrowExceptionInterceptor.execute(RethrowExceptionInterceptor.java:17)
at org.mule.execution.TransactionalErrorHandlingExecutionTemplate.execute(TransactionalErrorHandlingExecutionTemplate.java:113)
at org.mule.execution.TransactionalErrorHandlingExecutionTemplate.execute(TransactionalErrorHandlingExecutionTemplate.java:34)
at org.mule.processor.AsyncInterceptingMessageProcessor$AsyncMessageProcessorWorker.doRun(AsyncInterceptingMessageProcessor.java:184)
at org.mule.work.AbstractMuleEventWork.run(AbstractMuleEventWork.java:43)
at org.mule.work.WorkerContext.run(WorkerContext.java:311)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.cxf.binding.soap.jms.interceptor.JMSFault: Missing ContentType.
at org.apache.cxf.binding.soap.jms.interceptor.JMSFaultFactory.createFault(JMSFaultFactory.java:111)
at org.apache.cxf.binding.soap.jms.interceptor.JMSFaultFactory.createMissingContentTypeFault(JMSFaultFactory.java:72)
at org.apache.cxf.binding.soap.jms.interceptor.SoapJMSInInterceptor.checkContentType(SoapJMSInInterceptor.java:188)
... 38 more
The loggers in the code give correct Content-Type but still the error persists.
Can anyone help?
Thanks in advance
Your issue with the Content-Type could be due to old version, as I can not reproduce it.
However, if you want to use xml data to call SOAP web service, I think your approach is incorrect. You should use a proxy client, instead. Something like this:
<jms:inbound-endpoint queue="DimQueue" connector-ref="Active_MQ" doc:name="JMS"/>
<set-property propertyName="Content-Type" value="application/soap+xml" doc:name="Property"/>
<set-property propertyName="SOAPAction" value="urn:#myMethod" doc:name="Property"/>
<cxf:proxy-client payload="envelope" doc:name="SOAP"/>
<http:outbound-endpoint exchange-pattern="request-response" host="localhost" port="9090" method="POST" doc:name="HTTP">
</http:outbound-endpoint>
Related
I have a scenario like below,
Inbound Queue called 'InQ'(Synchronous) which will have messages each with messageHeader JMSXGroupID(Example A or B Or C).Based on the JMSXGroupId header i will route to clientA or ClientB or ClientC.
SomeTime If ClientA takes longer Time to respond. I don't want to take the otherMessages in Queue InQ' which haveJMSXGroupID=A`.Once the response is back, i need to process the other messages in Order.
I did implemented Client Ack Transaction.But in this cases if i'm waiting for the response from ClientA, other messages with JMXGroupId B and C also seems to be waiting.Which means it looking by overall one by one(FIFO) which i don't want to do.
Not sure how to implement FIFO based on JMSXGroupID. Any thoughts and Ideas will be helpful. Thanks in advance.
<jms:activemq-connector name="Active_MQ" username="....." password="..." brokerURL="...." validateConnections="true" doc:name="Active MQ" numberOfConsumers="1" maxRedelivery="-1" disableTemporaryReplyToDestinations="true" persistentDelivery="true"/>
<flow name="testFlow">
<jms:inbound-endpoint connector-ref="Active_MQ" doc:name="JMS" queue="InQ" exchange-pattern="request-response">
<jms:client-ack-transaction action="ALWAYS_BEGIN"/>
</jms:inbound-endpoint>
<logger level="INFO" doc:name="Logger" message="**testCheck#[payload]"/>
<choice doc:name="Choice">
<when expression="#[message.inboundProperties.JMSXGroupId=='A']">
<logger level="INFO" doc:name="Logger" message="***first***"/>
<flow-ref name="ClientA" doc:name="ClientA"/>
</when>
<when expression="#[message.inboundProperties.JMSXGroupId=='B']">
<flow-ref name="ClientB" doc:name="ClientB"/>
</when>
<when expression="#[message.inboundProperties.JMSXGroupId=='C']">
<flow-ref name="ClientC" doc:name="ClientC"/>
</when>
<otherwise>
<logger level="INFO" doc:name=" Other Logger"/>
</otherwise>
</choice>
</flow>
Edit1: Made all the 3 , listening to the same Queue.
<composite-source doc:name="Composite Source">
<jms:inbound-endpoint connector-ref="Active_MQ" doc:name="JMS" queue="InQ">
<jms:selector expression="JMSXGroupID=A"/>
</jms:inbound-endpoint>
<jms:inbound-endpoint connector-ref="Active_MQ" doc:name="JMS" queue="InQ">
<jms:selector expression="JMSXGroupID=B"/>
</jms:inbound-endpoint>
<jms:inbound-endpoint connector-ref="Active_MQ" doc:name="JMS" queue="InQ">
<jms:selector expression="JMSXGroupID=C"/>
</jms:inbound-endpoint>
</composite-source>
It does thrown the error There is already a listener registered on this connector on endpointUri: jms://InQ.
I am using collection-splitter to split my List. Now how should I set the payload to SFTP outbound-endpoint.
<sftp:inbound-endpoint connector-ref="sftp-inbound" host="${SFTP_HOST}" port="${SFTP_PORT}"
path="/files/" user="${SFTP_USER}" password="${SFTP_PASS}"
responseTimeout="10000" pollingFrequency="30000" fileAge="20000" sizeCheckWaitTime="5000"
archiveDir="/files/archive/" doc:name="SFTP" >
<file:filename-regex-filter pattern="Test(.*).zip" caseSensitive="true"/>
</sftp:inbound-endpoint>
<set-variable variableName="regexVal" value="${REGEX}" doc:name="Variable"/>
<set-variable variableName="sourceFileName" value="#[flowVars.originalFilename]" doc:name="Variable"/>
<custom-transformer name="zipTxt" class="com.mst.transform.UnzipTransformer" doc:name="Java" mimeType="image/gif">
<spring:property name="filenamePattern" value="*.csv,*.txt" />
</custom-transformer>
<set-variable variableName="fileContents" value="#[payload]" />
<collection-splitter enableCorrelation="IF_NOT_SET" />
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
<sftp:outbound-endpoint connector-ref="sftp-inbound"
host="${SFTP_HOST}" port="${SFTP_PORT}"
path="/files/" user="${SFTP_USER}" password="${SFTP_PASS}"
responseTimeout="10000" doc:name="SFTP"
exchange-pattern="one-way"/>
</flow>
If your payload before collection splitter is list of objects that can be consumed by SFTP outbound endpoint like InputStream, then after splitter, you can wrap logger, sftp inside processor-chain. Splitter will send each object one-by-one to processor chain. SFTP should be able to write it if its an InputSream.
<collection-splitter enableCorrelation="IF_NOT_SET" />
<processor-chain doc:name="Processor Chain">
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
<sftp:outbound-endpoint connector-ref="sftp-inbound"
host="${SFTP_HOST}" port="${SFTP_PORT}"
path="/files/" user="${SFTP_USER}" password="${SFTP_PASS}"
responseTimeout="10000" doc:name="SFTP"
exchange-pattern="one-way"/>
</processor-chain>
You wouldn't need processor-chain if you just want to put one processor (eg. SFTP) after splitter.
If this doesn't work, then please add error details to question.
I have a flow with the following steps:
1) Pick a file from source SFTP sever
2) Copy it into local storage
3) Process file using the copy in the local storage
4) Place the processed file (which will be transformed) into a destination SFTP server
5) Move file present in the source SFTP into a different folder on the source SFTP server (I could not find a way to do this and hence I'm copying from the temp location back into the SFTP processed folder)
This seems to a standard workflow, however I could not find any advice on how to specifically implement this in Mule.
My current implementation is described below:
<file:connector name="tempFile" workDirectory="${temp.file.location}/work"
workFileNamePattern="#[message.inboundProperties.originalFilename]"
autoDelete="true" streaming="false" validateConnections="true"
doc:name="File" />
<sftp:connector name="InputSFTP" validateConnections="true" keepFileOnError="true" doc:name="SFTP" >
<reconnect frequency="${reconnectfrequency}" count="5"/>
</sftp:connector>
<sftp:connector name="DestinationSFTP" validateConnections="true" pollingFrequency="30000" doc:name="SFTP">
<reconnect frequency="${reconnectfrequency}" count="5"/>
</sftp:connector>
<smtp:gmail-connector name="Gmail" contentType="text/plain" validateConnections="true" doc:name="Gmail"/>
<flow name="DownloadFTPFileIntoLocalFlow" processingStrategy="synchronous" tracking:enable-default-events="true">
<sftp:inbound-endpoint connector-ref="InputSFTP" host="${source.host}" port="22" path="${source.path}" user="${source.username}"
password="${source.password}" responseTimeout="90000" pollingFrequency="120000" sizeCheckWaitTime="1000" doc:name="InputSFTP" autoDelete="true">
<file:filename-regex-filter pattern="[Z].*\.csv" caseSensitive="false" />
</sftp:inbound-endpoint>
<file:outbound-endpoint path="${temp.file.location}" responseTimeout="10000" doc:name="Templocation" outputPattern="#[message.inboundProperties.originalFilename]" connector-ref="tempFile" />
<exception-strategy ref="Default_Exception_Strategy" doc:name="Reference Exception Strategy"/>
</flow>
<flow name="ProcessCSVFlow" processingStrategy="synchronous" tracking:enable-default-events="true">
<file:inbound-endpoint path="${temp.file.location}" connector-ref="tempFile" pollingFrequency="180000" fileAge="10000" responseTimeout="10000" doc:name="TempFileLocation"/>
<transformer ref="enrichWithHeaderAndEndOfFileTransformer" doc:name="headerAndEOFEnricher" />
<set-variable variableName="outputfilename" value="#['Mercury'+server.dateTime.year+server.dateTime.month+server.dateTime.dayOfMonth+server.dateTime.hours +server.dateTime.minutes+server.dateTime.seconds+'.csv']" doc:name="outputfilename"/>
<sftp:outbound-endpoint exchange-pattern="one-way" connector-ref="DestinationSFTP" host="${destination.host}" port="22" responseTimeout="10000" doc:name="DestinationSFTP"
outputPattern="#[outputfilename]" path="${destination.path}" user="${destination.username}" password="${destination.password}"/>
<gzip-compress-transformer/>
<sftp:outbound-endpoint exchange-pattern="one-way" connector-ref="InputSFTP" host="${source.host}" port="22" responseTimeout="10000" doc:name="SourceArchiveSFTP"
outputPattern="#[outputfilename].gzip" path="Archive" user="${source.username}" password="${source.password}"/>
<set-payload value="Hello world" doc:name="Set Payload"/>
<smtp:outbound-endpoint host="${smtp.host}" port="${smtp.port}" user="${smtp.from.address}" password="${smtp.from.password}"
to="${smtp.to.address}" from="${smtp.from.address}" subject="${mail.success.subject}" responseTimeout="10000"
doc:name="SuccessEmail" connector-ref="Gmail"/>
<logger message="Process completed successfully" level="INFO" doc:name="Logger"/>
<tracking:transaction id="#[server.dateTime]"/>
<exception-strategy ref="Default_Exception_Strategy" doc:name="Reference Exception Strategy"/>
</flow>
<catch-exception-strategy name="Default_Exception_Strategy">
<logger message="Exception has occured Payload is #[payload] and Message is #[message]" level="ERROR" doc:name="Logger"/>
<!-- <smtp:outbound-endpoint host="localhost" responseTimeout="10000" doc:name="Failure Email"/> -->
</catch-exception-strategy>
Have you tried enabling autoDelete="true" on the SFTP connector to force deleting?
Also, is it not possible to do flow1: SFTP-in -> transform -> file out, flow2: file-in -> SFTP-out?
HTH
Can a queue consume from a topic directly in a publish-subscribe mode.Can somebody provide pointers on this. I am using websphere MQ as a JMS broker.What should be the Mule configuration for setting this up.
Mule Configuration
testTopic10 is the topic name
testQueue10 is the queue name
<!-- Publisher Flow -->
<flow name="PublisherFlow" doc:name="PublisherFlow">
<file:inbound-endpoint path="c:\retryin" responseTimeout="10000" doc:name="File"/>
<object-to-string-transformer doc:name="Object to String"/>
<jms:outbound-endpoint topic="testTopic10" doc:name="JMS" connector-ref="WMQ_Pub_Topic_Connector"/>
</flow>
<!-- Transfer from topic to Queue -->
<flow name="SubscriberFlowQueueTransfer" doc:name="SubscriberFlowQueueTransfer">
<jms:inbound-endpoint topic="testTopic10" connector-ref="WMQ_Pub_Topic_Connector" doc:name="JMS">
</jms:inbound-endpoint>
<logger message="Entered Subscriber Queue transfer" level="INFO" doc:name="Logger"/>
<jms:outbound-endpoint queue="testQueue10" connector-ref="WMQ_Sub_Queue_Connector" doc:name="JMS">
</jms:outbound-endpoint>
</flow>
<!-- Subscriber Flow -->
<flow name="SubscriberFlowQueue" doc:name="SubscriberFlowQueue">
<jms:inbound-endpoint queue="testQueue10" connector-ref="WMQ_Sub_Queue_Connector" doc:name="JMS">
<jms:transaction action="ALWAYS_BEGIN" timeout="3000"/>
</jms:inbound-endpoint>
<logger message="Entered subscriber flow" level="INFO" doc:name="Logger"/>
<ftp:outbound-endpoint host="XXX.XXX.XX.XX" port="21" path="path" user="test" password="test123" responseTimeout="10000" doc:name="FTP"/>
<rollback-exception-strategy doc:name="Rollback Exception Strategy" enableNotifications="false"/>
</flow>
Connector Configurations
<jms:connector name="WMQ_Pub_Topic_Connector" specification="1.1" validateConnections="true" connectionFactory-ref="WebSphereMQConnectionFactory" doc:name="JMS" durable="true" clientId="mule-server-01" persistentDelivery="true" maxRedelivery="5">
<reconnect-forever frequency="5000" />
</jms:connector>
<jms:connector name="WMQ_Sub_Queue_Connector" specification="1.1" validateConnections="true" connectionFactory-ref="WebSphereMQConnectionFactory" doc:name="JMS" durable="true" clientId="mule-server-01" persistentDelivery="true" maxRedelivery="5">
<receiver-threading-profile maxThreadsActive="1"/>
<reconnect-forever/>
</jms:connector>
It's pretty straightforward, you can take a look at WebSphere MQ transpor documentation and WebShphere MQ example. But basically you need to:
Configure a WMQ connector
<wmq:connector name="wmqConnector" hostName="${wmq.host}" port="${wmq.port}" queueManager="${wmq.queue.manager}" username="${wmq.username}" password="${wmq.password}" />
Create a flow with an endpoint
<flow name="MessageProcessor">
<wmq:inbound-endpoint connector-ref="wmqConnector" queue="topic.in">
...
</flow>
Add MQ jars to MULE_HOME/lib/user
com.ibm.mq.jar
com.ibm.mqetclient.jar (if using remote XA transactions)
com.ibm.mq.jmqi.jar
com.ibm.mqjms.jar
dhbcore.jar
We are getting an error while using proxy client to send an XML to a web service. Here is the configuration:
<flow name="CreateDIMEntry" doc:name="CreateDIMEntry">
<vm:outbound-endpoint exchange-pattern="one-way" path="DIM_VM" doc:name="VM"/>
<byte-array-to-string-transformer doc:name="Byte Array to String"/>
<mulexml:xslt-transformer maxIdleTransformers="2" maxActiveTransformers="5" xsl-file="D:\Users\vkamat\Desktop\dim\src\main\resources\addenvelopetopayload.xsl" doc:name="XSLT"/>
<byte-array-to-string-transformer doc:name="Byte Array to String"/>
<logger message="I am here..#[message.payload]" level="INFO" doc:name="Logger"/>
<set-property propertyName="SOAPAction" value="urn:com.org.ProcessActivity" doc:name="Property"/>
<set-property propertyName="Content-Type" value="application/soap+xml" doc:name="Property"/>
<!-- <set-property propertyName="SOAPAction" value="urn:com.org.ProcessActivity" doc:name="Property"/> -->
<cxf:proxy-client doc:name="SOAP" payload="envelope">
</cxf:proxy-client >
<http:outbound-endpoint exchange-pattern="request-response" host="${dim.host}" port="${dim.port}" method="POST" doc:name="HTTP" path="${dim.path}">
</http:outbound-endpoint>
</flow>
when called this flow with testing flow as below, it works fine
<flow name="DimFlow1" doc:name="DimFlow1">
<file:inbound-endpoint path="D:\Documents\test" responseTimeout="10000" doc:name="File"/>
<flow-ref name="CreateDIMEntry" doc:name="Flow Reference"/>
</flow>
But when integrated in another flow, it gives an error, Giving snippet of main flow from where it is getting called
<async doc:name="Async">
<mulexml:object-to-xml-transformer doc:name="Object to XML"/>
<mulexml:xslt-transformer maxIdleTransformers="2" maxActiveTransformers="5" xsl-file="D:\addenvelopetopayload.xsl" doc:name="XSLT"/>
<logger message="before DIM-- #[message.payload]" level="INFO" doc:name="Logger"/>
<flow-ref name="CreateDIMEntry" doc:name="Flow Reference"/>
</async>
The error encountered is
********************************************************************************
Message : java.lang.reflect.Method cannot be cast to java.lang.String. Failed to route event via endpoint: org.mule.module.cxf.CxfOutboundMessageProcessor. Message payload is of type: ReversibleXMLStreamReader
--------------------------------------------------------------------------------
Exception stack is:
1. java.lang.reflect.Method cannot be cast to java.lang.String (java.lang.ClassCastException)
org.mule.module.cxf.CxfOutboundMessageProcessor:338 (null)
2. java.lang.reflect.Method cannot be cast to java.lang.String. Failed to route event via endpoint: org.mule.module.cxf.CxfOutboundMessageProcessor. Message payload is of type: ReversibleXMLStreamReader (org.mule.api.transport.DispatchException)
org.mule.module.cxf.CxfOutboundMessageProcessor:150 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transport/DispatchException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
java.lang.ClassCastException: java.lang.reflect.Method cannot be cast to java.lang.String
at org.mule.module.cxf.CxfOutboundMessageProcessor.getMethodOrOperationName(CxfOutboundMessageProcessor.java:338)
at org.mule.module.cxf.CxfOutboundMessageProcessor.getOperation(CxfOutboundMessageProcessor.java:356)
at org.mule.module.cxf.CxfOutboundMessageProcessor.doSendWithClient(CxfOutboundMessageProcessor.java:212)
+ 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************
Try setting the following before the CXF client:
<set-variable value="#[flowVars['cxf_operation'].getLocalPart()]" variableName="operation" />