Wednesday, March 9, 2016

Message Processor giving error while sending message to back-end service.

Environment - ESB 
                         jdk1.8.0_72

Preconditions: ESB should be started.
                        Axis2 Server should be started
                        Axis2 sample client used to publish messages
                                         
Situation - Configured a message processor(Scheduled Message Forwarding Processor) which targeting a message store and particular endpoint.

                  Sample config:
<messageProcessor class="org.apache.synapse.message.processor.impl.forwarder.ScheduledMessageForwardingProcessor" messageStore="reg" name="storeProce" targetEndpoint="StockQuote">
    <parameter name="client.retry.interval">1000</parameter>
    <parameter name="throttle">false</parameter>
    <parameter name="max.delivery.attempts">4</parameter>
    <parameter name="member.count">1</parameter>
    <parameter name="max.delivery.drop">Enabled</parameter>
    <parameter name="interval">1000</parameter>
    <parameter name="message.processor.deactivate.sequence">fault</parameter>
    <parameter name="is.active">true</parameter>
    <parameter name="target.endpoint">StockQuote</parameter>
</messageProcessor>


            Store mediator created as follows:

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="onstoreSeq">
    <store messageStore="reg" sequence="conf:/registrySeq" />
</sequence>

Then created a proxy and used Sample axis2Client ($ESB_HOME/samples/axis2Client/) to invoke proxy. Synapse config can find below[1]
       
         axis2Client Command:
         
ant stockquote -Daddurl=http://localhost:8280/services/regProxy -Dmode=placeorder - Dsymbol=MSFT
           
Error -  When publishing messages, Back end will receive it, But processor retries and give an error as follows: 

ERROR - ForwardingService BlockingMessageSender of message processor [storeProce] failed to send message to the endpoint

Analysis - It is about accepting message with different properties. So added property mediators to change message properties related to ESB.

Solution -  Add following properties before store mediator as follows:

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="onstoreSeq">
    <property name="FORCE_SC_ACCEPTED" scope="axis2" value="true" />
    <property name="OUT_ONLY" value="true" />
    <store messageStore="reg" sequence="conf:/registrySeq" />
</sequence>
[1] - Synapse Config

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://ws.apache.org/ns/synapse">
    <registry provider="org.wso2.carbon.mediation.registry.WSO2Registry">
        <parameter name="cachableDuration">15000</parameter>
    </registry>
    <taskManager provider="org.wso2.carbon.mediation.ntask.NTaskTaskManager" />
    <proxy name="regProxy" startOnLoad="true" trace="disable" transports="http https">
        <description />
        <target inSequence="onstoreSeq" />
    </proxy>
    <endpoint name="StockQuote">
        <address uri="http://127.0.0.1:9000/services/SimpleStockQuoteService" />
    </endpoint>
    <sequence name="onstoreSeq">
        <property name="FORCE_SC_ACCEPTED" scope="axis2" value="true" />
        <property name="OUT_ONLY" value="true" />
        <store messageStore="reg" sequence="conf:/registrySeq" />
    </sequence>
    <sequence name="fault">
        <!-- Log the message at the full log level with the ERROR_MESSAGE and the ERROR_CODE-->
        <log level="full">
            <property name="MESSAGE" value="Executing default 'fault' sequence" />
            <property expression="get-property('ERROR_CODE')" name="ERROR_CODE" />
            <property expression="get-property('ERROR_MESSAGE')" name="ERROR_MESSAGE" />
        </log>
        <!-- Drops the messages by default if there is a fault -->
        <drop />
    </sequence>
    <sequence name="main">
        <in>
            <!-- Log all messages passing through -->
            <log level="full" />
            <filter regex="http://localhost:9000.*" source="get-property('To')">
                <!-- Send the messages where they have been sent (i.e. implicit "To" EPR) -->
                <send />
            </filter>
        </in>
        <out>
            <send />
        </out>
        <description>The main sequence for the message mediation</description>
    </sequence>
    <messageStore name="reg" />
    <messageStore name="InStore" />
    <messageProcessor class="org.apache.synapse.message.processor.impl.forwarder.ScheduledMessageForwardingProcessor" messageStore="reg" name="storeProce" targetEndpoint="StockQuote">
        <parameter name="client.retry.interval">1000</parameter>
        <parameter name="throttle">false</parameter>
        <parameter name="max.delivery.attempts">4</parameter>
        <parameter name="member.count">1</parameter>
        <parameter name="max.delivery.drop">Enabled</parameter>
        <parameter name="interval">1000</parameter>
        <parameter name="message.processor.deactivate.sequence">fault</parameter>
        <parameter name="is.active">true</parameter>
        <parameter name="target.endpoint">StockQuote</parameter>
    </messageProcessor>
    <!-- You can add any flat sequences, endpoints, etc.. to this synapse.xml file if you do

    *not* want to keep the artifacts in several files -->
</definitions>


No comments:

Post a Comment