WSO2 ESB- Error Handling - On Error Sequence - xpath

For which are all the mediators onError Sequence works?
ex: I tried Enrich mediator it didn't work and send mediator it worked.
<inSequence onError="errorhandler" xmlns="http://ws.apache.org/ns/synapse">
<enrich>
<source clone="true" type="custom" xpath="//Body/xs"/>
<target action="replace" property="ORIGREQUES" type="property"/>
</enrich>
Here given xpath is wrong. In wso2Carbon.log got the below message.
ERROR {org.apache.synapse.mediators.elementary.EnrichMediator} -
Specified node by xpath cannot be found.
{org.apache.synapse.mediators.elementary.EnrichMediator}
<api xmlns="http://ws.apache.org/ns/synapse" name="addTripService" context="/trip" hostname="localhost" port="8280"> <resource methods="POST" uri-template="/add/v2" faultSequence="fault">
<inSequence onError="errorhandler">
<enrich>
<source clone="true" xpath="//Body/xs"/>
<target type="property" property="ORIGREQUES"/>
</enrich>
<send/>
</inSequence>
Here getting the error message whatever I have given in Errorhandler sequence.
This means that onError Sequence works for send mediator and not for enrich mediator. So please let me know for which all mediators it works?
Thanks in advance.

This [1] article contains detailed description about error handling in WSO2 ESB. Go through it and you will understand how the mediators works and how to handle the errors properly.
[1] http://wso2.com/library/articles/2012/10/wso2-esb-examples-best-practises-error-handling-wso2-esb/

Related

wso2esb failover configuration throws error

this is my proxy configuration
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse" name="FileProcessorProxy" transports="vfs" startOnLoad="true" trace="disable">
<target>
<inSequence>
<log level="full"/>
<property xmlns:ns2="http://org.apache.synapse/xsd" name="transport.vfs.ReplyFileName" expression="fn:concat(fn:substring-after(get-property('MessageID'), 'urn:uuid:'), '.txt')" scope="transport" type="STRING"/>
<property name="OUT_ONLY" value="true" scope="default" type="STRING"/>
<send>
<endpoint name="FailOverTest">
<failover>
<endpoint name="endpoint_urn_uuid_6179155B57847314A656794419902014617670556">
<address uri="vfs:file:///opt/wso2/wso2data/esboverviewtest/out"/>
</endpoint>
<endpoint name="endpoint_urn_uuid_failureOut">
<address uri="vfs:file:///opt/wso2/wso2data/esboverviewtest/failureOut"/>
</endpoint>
</failover>
</endpoint>
</send>
</inSequence>
<outSequence/>
<faultSequence>
<log level="full">
<property name="faultSequence" value="send endpoint error"/>
</log>
</faultSequence>
</target>
<parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter>
<parameter name="transport.PollInterval">5</parameter>
<parameter name="transport.vfs.MoveAfterProcess">file:///opt/wso2/wso2data/esboverviewtest/original</parameter>
<parameter name="transport.vfs.FileURI">file:///opt/wso2/wso2data/esboverviewtest/in</parameter>
<parameter name="transport.vfs.MoveAfterFailure">file:///opt/wso2/wso2data/esboverviewtest/failureIn</parameter>
<parameter name="transport.vfs.FileNamePattern">.*.txt</parameter>
<parameter name="transport.vfs.ContentType">text/plain</parameter>
<parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>
<parameter name="transport.vfs.MoveTimestampFormat">yyyy-MM-dd'T'HH:mm:ss.SSSZ_</parameter>
</proxy>
when I drop a proper file to to the "in" folder I got the following error -
[2015-09-06 18:36:50,092] INFO - LogMediator To: , WSAction: urn:mediate, SOAPAction: urn:mediate, MessageID: urn:uuid:3D8967DAB6BB7F719D1441546610096, Direction: request, Envelope: <?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><text xmlns="http://ws.apache.org/commons/ns/payload">test message 1
</text></soapenv:Body></soapenv:Envelope>
[2015-09-06 18:36:50,092] ERROR - ClientUtils Address information does not exist in the Endpoint Reference (EPR).The system cannot infer the transport mechanism.
[2015-09-06 18:36:50,092] ERROR - Axis2Sender Unexpected error during sending message out
org.apache.axis2.AxisFault: Address information does not exist in the Endpoint Reference (EPR).The system cannot infer the transport mechanism.
at org.apache.axis2.description.ClientUtils.inferOutTransport(ClientUtils.java:73)
at org.apache.axis2.client.OperationClient.prepareMessageContext(OperationClient.java:288)
at org.apache.axis2.description.OutOnlyAxisOperationClient.executeImpl(OutOnlyAxisOperation.java:249)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:149)
at org.apache.synapse.core.axis2.Axis2FlexibleMEPClient.send(Axis2FlexibleMEPClient.java:482)
at org.apache.synapse.core.axis2.Axis2Sender.sendOn(Axis2Sender.java:59)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:338)
at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:94)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:77)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:131)
at org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:166)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.axis2.transport.base.AbstractTransportListener.handleIncomingMessage(AbstractTransportListener.java:328)
at org.apache.synapse.transport.vfs.VFSTransportListener.processFile(VFSTransportListener.java:597)
at org.apache.synapse.transport.vfs.VFSTransportListener.scanFileOrDirectory(VFSTransportListener.java:328)
at org.apache.synapse.transport.vfs.VFSTransportListener.poll(VFSTransportListener.java:158)
at org.apache.synapse.transport.vfs.VFSTransportListener.poll(VFSTransportListener.java:107)
at org.apache.axis2.transport.base.AbstractPollingTransportListener$1$1.run(AbstractPollingTransportListener.java:67)
at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
[2015-09-06 18:36:50,093] INFO - LogMediator To: , WSAction: urn:mediate, SOAPAction: urn:mediate, MessageID: urn:uuid:3D8967DAB6BB7F719D1441546610096, Direction: request, faultSequence = send endpoint error, Envelope: <?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><text xmlns="http://ws.apache.org/commons/ns/payload">test message 1
</text></soapenv:Body></soapenv:Envelope>
to be short:
[2015-09-06 18:36:50,092] ERROR - Axis2Sender Unexpected error during sending message out
org.apache.axis2.AxisFault: Address information does not exist in the Endpoint Reference (EPR).The system cannot infer the transport mechanism.
However, if I remove failover configuration and leave just simple endpoint with "out" directory the file is process succesfully.
I cannot understand why failover throws such exception and how to fix it.
Somehow, by checking various options, i figured out that if you change endpoint name you MUST call "publish" command against the wso2esb server again (in WSO2 development studio). In other case, wso2esb does not see endpoint's new name
I am still not sure why it is so (bug?). At least, now I have a workaround...
In my case I get URL from the database, accidentally I set it as an empty, that's why I got the issue like above.

processing jms message in wso2 esb

I have the JMS message as
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<content>
<entry type="1">
<textMessage JMSDeliveryMode="2" JMSDestination="queue:///QUEUE" JMSExpiration="0" JMSMessageID="ID:c3e2d840d8e3c1f14040404040404040cf1eba01c4eff036" JMSPriority="4" JMSRedelivered="false" JMSTimestamp="1434705226223" fromQueue="true" codec="Base64">
<text>dGVzdA==</text>
</textMessage>
</entry>
</content>
but when i pull it into wso2 esb it gets into soap envelope and i'm not able to retrieve the properties over here, like JMSDestination etc.
I want to read those details in WSO2 ESB. Is there a way?
I get the following SOAP message after getting the message from JMS, and it is logging or the xPath works only on this.
[2015-06-22 11:08:33,632] INFO - LogMediator To: , WSAction: urn:mediate, SOAPA
ction: urn:mediate, MessageID: ID:c3e2d840d8e3c1f14040404040404040cf224f7f3bbf47
25, Direction: request, Envelope: <?xml version="1.0" encoding="utf-8"?><soapenv
:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Bod
y>test1</soapenv:Body></soapenv:Envelope>
Thanks
I'm setting the JMS headers in my sending proxy like this.
In the receiving proxy, you can then access the property with get-property like in the following example.
<log level="custom">
<property name="Autodeploy_TSONL_CreateProxyTarget - Config Params transport intervall "
expression="get-property('transport','TRANSPORT_TRANSFERINTERVALL')"/>
Hope that helps.
You can select any information from the message body (even if there is a soap envelope for internal purposes) with the following code in your inSequence:
<property name="JMSDestination" expression="$body/content/entry/textMessage/#JMSDestination"/>
Verify that your message is being build with an appropriate message builder, otherwise you can't see the message content. See this JMS Proxy example:
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse" name="JMSProxyName" transports="jms" startOnLoad="true" trace="disable">
<target>
<inSequence>
<log level="custom">
<property name="Log JMSDestination" expression="$body/content/entry/textMessage/#JMSDestination"/>
</log>
<drop/>
</inSequence>
<outSequence/>
<faultSequence/>
</target>
<parameter name="transport.jms.ContentType">
<rules>
<jmsProperty>contentType</jmsProperty>
<default>application/xml</default>
</rules>
</parameter>
<parameter name="transport.jms.Destination">YourQueue</parameter>
</proxy>

WSO2 Message Broker not receiving message

i followed the official documentation dealing with the integration between WSO2 ESB and WSO2 MB.
https://docs.wso2.com/display/MB210/Integrating+WSO2+ESB
On my WSO2 ESB 8.1.0 i wrote a simple proxy like this:
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="jobReplicaFeed"
transports="https,http"
statistics="disable"
trace="disable"
startOnLoad="true">
<target>
<inSequence>
<log level="full"/>
<send>
<endpoint key="ReplicaFeedEndpoint"/>
</send>
</inSequence>
<outSequence>
<log level="full"/>
</outSequence>
</target>
<description/>
</proxy>
where ReplicaFeedEndpoint is like the following linsting:
<endpoint xmlns="http://ws.apache.org/ns/synapse" name="ReplicaFeedEndpoint">
<address uri="jms:/REPLICA_FEED?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&java.naming.factory.initial=org.wso2.andes.jndi.PropertiesFileInitialContextFactory&java.naming.provider.url=repository/conf/jndi.properties&transport.jms.DestinationType=topic">
<suspendOnFailure>
<progressionFactor>1.0</progressionFactor>
</suspendOnFailure>
<markForSuspension>
<retriesBeforeSuspension>0</retriesBeforeSuspension>
<retryDelay>0</retryDelay>
</markForSuspension>
</address>
</endpoint>
and this is my jndi.properties:
connectionfactory.QueueConnectionFactory = amqp://admin:admin#clientID/carbon?brokerlist='tcp://myHost:5672'
connectionfactory.TopicConnectionFactory = amqp://admin:admin#clientID/carbon?brokerlist='tcp://myHost:5672'
topic.MioEvento = REPLICA_FEED
using a simple REST client i'm trying to send a message to the proxy, expecting the same to be intercepted by the message broker.
Nothing happens. Furthermore, trying different times i get randomly this exception:
TID: [0] [ESB] [2015-05-06 19:55:16,503] ERROR {org.apache.axis2.transport.jms.JMSOutTransportInfo} - Couldn't locate the JMS destination REPLICA_FEED of type topic/ extracted from the URL jms:/REPLICA_FEED?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&java.naming.factory.initial=org.wso2.andes.jndi.PropertiesFileInitialContextFactory&java.naming.provider.url=repository/conf/jndi.properties&transport.jms.DestinationType=topic/ {org.apache.axis2.transport.jms.JMSOutTransportInfo}
javax.naming.NameNotFoundException: dynamicQueues/REPLICA_FEED
at org.wso2.andes.jndi.ReadOnlyContext.lookup(ReadOnlyContext.java:271)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at org.apache.axis2.transport.jms.JMSUtils.lookup(JMSUtils.java:583)
at org.apache.axis2.transport.jms.JMSUtils.lookupDestination(JMSUtils.java:814)
at org.apache.axis2.transport.jms.JMSOutTransportInfo.getDestination(JMSOutTransportInfo.java:184)
at org.apache.axis2.transport.jms.JMSOutTransportInfo.loadConnectionFactoryFromProperties(JMSOutTransportInfo.java:132)
at org.apache.axis2.transport.jms.JMSOutTransportInfo.createJMSSender(JMSOutTransportInfo.java:330)
at org.apache.axis2.transport.jms.JMSSender.sendMessage(JMSSender.java:127)
at org.apache.axis2.transport.base.AbstractTransportSender.invoke(AbstractTransportSender.java:112)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)
at org.apache.synapse.core.axis2.DynamicAxisOperation$DynamicOperationClient.send(DynamicAxisOperation.java:185)
at org.apache.synapse.core.axis2.DynamicAxisOperation$DynamicOperationClient.executeImpl(DynamicAxisOperation.java:167)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:149)
at org.apache.synapse.core.axis2.Axis2FlexibleMEPClient.send(Axis2FlexibleMEPClient.java:482)
at org.apache.synapse.core.axis2.Axis2Sender.sendOn(Axis2Sender.java:59)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:338)
at org.apache.synapse.endpoints.AbstractEndpoint.send(AbstractEndpoint.java:333)
at org.apache.synapse.endpoints.AddressEndpoint.send(AddressEndpoint.java:59)
at org.apache.synapse.endpoints.IndirectEndpoint.send(IndirectEndpoint.java:54)
at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:97)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:77)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:131)
at org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:166)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:344)
at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:385)
at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:183)
at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Threa
What could be the problem?
thanks
In the endpoint definition, the uri contains the JNDI entry to the queue, where as the transport is defined as a topic.
transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory
Should be
transport.jms.ConnectionFactoryJNDIName=TopicConnectionFactory
You can find further information in the following article on WSO2 ESB and MB Integration.
http://wso2.com/library/articles/2013/03/configuring-wso2-esb-wso2-message-broker/

WSO2 ESB aggregate mediator not working properly

i m using the wso2ESB 4.8.0 and i followed the sample at this url:
https://docs.wso2.org/display/ESB480/Sample+62:+Routing+a+Message+to+a+Dynamic+List+of+Recipients+and+Aggregating+Responses
writing this proxy service:
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="adminBroadcastEndpoint"
transports="https,http"
statistics="disable"
trace="disable"
startOnLoad="true">
<target>
<inSequence>
<send>
<endpoint>
<recipientlist>
<endpoint>
<address uri="http://127.0.0.1:8080/RestService/rest/servizio/"/>
</endpoint>
<endpoint>
<address uri="http://127.0.0.1:8081/RestService/rest/servizio/"/>
</endpoint>
</recipientlist>
</endpoint>
</send>
<drop/>
</inSequence>
<outSequence>
<payloadFactory media-type="xml">
<format>
<broadcast>
$1
</broadcast>
</format>
<args>
<arg evaluator="xml" expression="$body/root"/>
</args>
</payloadFactory>
<aggregate>
<completeCondition>
<messageCount/>
</completeCondition>
<onComplete xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" expression="/">
<send/>
</onComplete>
</aggregate>
</outSequence>
</target>
<description/>
</proxy>
in the recipient list there are two servers who answer with an xml string. The first server answer with
<root>
<codice>0</codice>
<messaggio>MESSAGE1</messaggio>
<result><name>CorreggiPecJob1</name><group>POSTA1</group></result>
<result><name>SchedulaIndiceJob1</name><group>INDICE1</group></result>
</root>
and the second server with:
<root>
<codice>0</codice>
<messaggio>MESSAGE2</messaggio>
<result><name>CorreggiPecJob2</name><group>POSTA2</group></result>
<result><name>SchedulaIndiceJob2</name><group>INDICE2</group></result>
</root>
After the aggregate mediator i should expect a result with all those 2 message merged... but in the response from the proxy service i get just the second server answer or the first one randomly.
If i put a log mediator suddenly after the onComplete tag hawever i the esb prints the whole merged message with the two response, but it seems that on the send mediator something goes lost.
Why does this happen?
Another question is: why xpath expressions like
$body/broadcast//result
don't work rising this exception?
2014-03-02 17:37:32,021] ERROR - AggregateMediator Error evaluating expression: $body/broadcast//result
org.apache.synapse.SynapseException: Could not find matching elements to aggregate.
I realize that if i define a namespace and a prfix to append in the payloadfactory like:
<payloadFactory xmlns:m0="my.namespace" media-type="xml">
<m0:format>
<m0:broadcast>
$1
</m0:broadcast>
</m0:format>
<args>
<arg evaluator="xml" expression="$body/root"/>
</args>
</payloadFactory>
the expression: $body/m0:broadcast work fine... so is it the namespace definition mandatory?
Is it there anything i'm missing? thanks
If the XML elements are in namespaces, than you're XPath must either define and use namespace prefixes, or specify any namespace in the path steps, like this:
$body/*:broadcast
i found the answer here: wso2 ESB : Split / Gather Pattern - Single Response
i solved using the enrich mediator. But i think that the aggregate mediator has not a really correct behaviour... maybe should be checked.

Filter Mediator on XPATH Functions

I am facing a problem with my code using Filter mediator and XPATH functions. What I am trying to do in my code is to check if a particular block is empty, do not call/enrich that block and move to another one checks for if it is empty, if not process it and moves to next one and in the end do a commit. Currently I am getting the error as:
FilterMediator Error evaluating XPath expression : fn:exists($body/product/simpleProduct/standardAttributes)
My code is as follows:
<inSequence>
<log level="custom">
<property name="STATUS" value="************ REQUEST ***************"/>
</log>
<transaction action="new"/>
<filter xpath="fn:exists($body/product/simpleProduct/standardAttributes)">
</filter>
<enrich>
<source type="body" clone="true"/>
<target type="property" property="MSG_PAYLOAD"/>
</enrich>
<log level="full"/>
<xslt key="simpleAttributes"/>
<log level="custom">
<property name="STATUS"
value="*********INSERTING Simple Product Attributes *************"/>
</log>
</inSequence>
It fails at fn:exists(). Can you help me with your inputs where am I going wrong?
Apparently the function you use is xpath 2 function. OOTB xpath 2 functions won't work in ESB. If this is xpath2, you have to enable it. To enable xpath 2, for that uncomment synapse.xpath.dom.failover.enabled=true in synapse.properties file.

Resources