1
votes

I have some questions because documentation is not clear..

How should I setup WSO2 ESB environment to be able to read and write messages form WSO2 MessageBroker.

I followed ConfigurewithWSO2MessageBroker

  1. I have ESB and MB on same server (MB has Offset=2) /repository/conf/axis2/axis2.xml

....

<transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener">
        <parameter name="JMSTopic" locked="false">
           <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
            <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
            <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">TopicConnectionFactory</parameter>
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>
        </parameter>

        <parameter name="JMSQueue" locked="false">
            <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
            <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
            <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
           <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
        </parameter>

        <parameter name="default" locked="false">
            <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
            <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
            <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
        </parameter>
    </transportReceiver>

...

and sender part

<transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender">    
      <parameter name="default" locked="false">
                 <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
                 <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
                 <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">ConnectionFactory</parameter>
          </parameter>        
     </transportSender>

jndi.properties files

connectionfactory.QueueConnectionFactory = amqp://admin:admin@clientID/carbon?brokerlist='tcp://gst-esb-qa-01:5674'
connectionfactory.TopicConnectionFactory = amqp://admin:admin@clientID/carbon?brokerlist='tcp://gst-esb-qa-01:5674'
connectionfactory.ConnectionFactory      = amqp://admin:admin@clientID/carbon?brokerlist='tcp://gst-esb-qa-01:5674'

queue.myQueue = myQueue
queue.testQueue= testQueue

topic.MyTopic = MyTopic

My proxy

<proxy name="SendMessagetoJMSProxy" transports="http" startOnLoad="true">
                  <target>
                     <endpoint>
                        <address uri="jms:/myQueue?&amp;transport.jms.DestinationType=queue"/>
                     </endpoint>
                     <inSequence>
                        <log level="custom">
                           <property name="STATE" value="message is sent to queue"/>
                        </log>
                        <property name="OUT_ONLY" value="true"/>
                        <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
                     </inSequence>
                     <outSequence/>
                  </target>
               </proxy>

my SOAP UI call

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.samples" xmlns:xsd="http://services.samples/xsd">
                   <soapenv:Header/>
                   <soapenv:Body>
                      <ser:dummy>
                            <xsd:symbol>IBM</xsd:symbol>
                      </ser:dummy>
                   </soapenv:Body>
                </soapenv:Envelope>

According to doc I should see the message in JMS Message Broker BUT I get

Error while building Passthrough stream

TID[-1234] [ESB] [2017-05-16 12:52:47,137] ERROR {org.apache.synapse.transport.passthru.util.RelayUtils} - Error while building Passthrough stream org.apache.axiom.om.impl.builder.StAXOMBuilder.lookahead(StAXOMBuilder.java:711) org.apache.axiom.soap.impl.llom.SOAPBodyImpl.hasLookahead(SOAPBodyImpl.java:191) org.apache.axiom.soap.impl.llom.SOAPBodyImpl.getFirstElementLocalName(SOAPBodyImpl.java:217) org.apache.axiom.soap.impl.llom.SOAPBodyImpl.hasFault(SOAPBodyImpl.java:99) org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.hasFault(SOAPEnvelopeImpl.java:305) org.apache.synapse.transport.passthru.util.DeferredMessageBuilder.getDocument(DeferredMessageBuilder.java:189) org.apache.synapse.transport.passthru.util.RelayUtils.builldMessage(RelayUtils.java:137) org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:100) org.apache.synapse.mediators.AbstractListMediator.buildMessage(AbstractListMediator.java:140) org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:83) org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:59) org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158) org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:210) org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:403) org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:151) org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) java.lang.Thread.run(Thread.java:745)

AND

Endpoint : AnonymousEndpoint with address jms:/myQueue?&transport.jms.DestinationType=queue will be marked SUSPENDED as it failed

First question : java.naming.provider.url param in axis2.xml is it relative to [ESB Home] location ?

Im my case server folder structure looks like ...enter image description here

maybe that should look like ....????

<parameter name="java.naming.provider.url" locked="false">file:/home/wso2admin/wso2esb-5.0.0/repository/conf/jndi.properties</parameter>

SECOND : is this error related to Message Builder and Formater ????

any help would be nice ...couse Im stuck for days ...

3
Remove the '&amp': ?& is not correct. Furthermore I don't think you even need the jms destinationtype as you configured your queue as 'default'. In my case I've added a <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> to the 'transportsender' parameters in axis2 xml, but I have an activeMQ instead of a MB so it is not 100% comparable.Jan
Thanks Jan for comment , but I wondering if we using JMS configuration part in axis2.xml for transportReceiver why we cannot only tell proxy the parameter name that we need ?? Why we again set ConnectionFactoryJNDIName,ConnectionFactoryType..ect..? Can we just put something like...<address uri="jms:/myQueue" /> and it should pick default JMS setting ???lpastor

3 Answers

2
votes

First Question:java.naming.provider.url param in axis2.xml is it relative to [ESB Home] location ?

No, you dont need to add ESB home location.

Second Question: is this error related to Message Builder and Formater ????

Yes, you are getting an error with message builders.

Just verify whether you added client jars and verify your proxy. Please create a proxy as follow and try it.

Sample Proxy:

<proxy name="QueueProxy" startOnLoad="true" transports="jms">
    <target>
        <inSequence>
             <property name="OUT_ONLY" value="true"/>
             <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
            <send>
                <endpoint>
                    <address uri="jms:/MyQueue?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&amp;java.naming.factory.initial=org.wso2.andes.jndi.PropertiesFileInitialContextFactory&amp;java.naming.provider.url=repository/conf/jndi.properties"/>
                </endpoint>
            </send>
        </inSequence>
    </target>
</proxy>

Reference: https://docs.wso2.com/display/ESB500/ESB+as+a+JMS+Producer

1
votes

Please try the below proxy and check the URL format you are using

<proxy xmlns="http://ws.apache.org/ns/synapse" name="StockQuoteProxy" transports="http">
<target>
    <inSequence>
        <property action="set" name="OUT_ONLY" value="true"/>
        <send>
            <endpoint>
                <address uri="jms:/myQueue?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&java.naming.provider.url=tcp://localhost:61616&transport.jms.DestinationType=queue"/>
            </endpoint>
        </send>
    </inSequence>
    <outSequence>
        <send/>
    </outSequence>
</target>
<publishWSDL uri="file:repository/samples/resources/proxy/sample_proxy_1.wsdl"/>

for more

1
votes

Thanks to Rajjaz and Jan ...

I created a proxy

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="SendMessagetoJMSProxy"
       startOnLoad="true"
       statistics="disable"
       trace="disable"
       transports="http,https">
   <target>
      <inSequence>
         <log level="custom">
            <property name="STATE" value="message is sent to myQueue"/>
         </log>
         <property name="OUT_ONLY" value="true"/>
         <property name="FORCE_SC_ACCEPTED" scope="axis2" value="true"/>
      </inSequence>
      <outSequence/>
      <endpoint>
         <address uri="jms:/myQueue?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&amp;java.naming.factory.initial=org.wso2.andes.jndi.PropertiesFileInitialContextFactory&amp;java.naming.provider.url=repository/conf/jndi.properties"/>
      </endpoint>
   </target>
   <description/>
</proxy>

also I figure out that if you have define default JMS configuration part in axis2.xml for transportReceiver it is enough to put name of Queue

so this is also working

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="SendMessagetoJMSProxy2"
       startOnLoad="true"
       statistics="disable"
       trace="disable"
       transports="http,https">
   <target>
      <inSequence>
         <log level="custom">
            <property name="STATE" value="message is sent to GST_TMS_ASSOCIATE_LEASE Queue"/>
         </log>
         <property name="OUT_ONLY" value="true"/>
         <property name="FORCE_SC_ACCEPTED" scope="axis2" value="true"/>
      </inSequence>
      <outSequence/>
      <endpoint>
         <address uri="jms:/myQueue"/>
      </endpoint>
   </target>
   <description/>
</proxy>

and now I can publish a message to JMS queue with proxy ...

Im little confused (still) where all this log in System logs coming from and why ?!?![enter image description here]1