2
votes

I am trying to send a message to JMS queue, the queue name is dynamic and it will be fetched from DB.

Along with the queue name, connection factory details, initial context factory, provider url are concatenated and saved in a property (endpt) in wso2 esb.

I want to use the final concatenated string (endpt) in send mediator as endpoint, i have given endpoint type as XPATH and called the variable using $ctx:endpt (endpt is the property where i have final formed URL), and it is not working.

<?xml version="1.0" encoding="UTF-8"?>
<property
expression="fn:concat('jms://', $ctx:queueName, '?
transport.jms.ConnectionFactoryJNDIName=', $ctx:connectionFactory,'&amp;java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory&amp;java.naming.provider.url=', 't3://localhost:7003,localhost:7004', '&amp;transport.jms.DestinationType=queue')"
name="endpt" scope="default" type="STRING"
xmlns="http://ws.apache.org/ns/synapse" 
xmlns:ns="http://org.apache.synapse/xsd"/>

EDIT 1: Code below is the complete sequence being called from a proxy service,

I need to send $body to the endpoint defined in To header. The same worked when i define a endpt in send mediator in the insequence of proxy service, but when i call the above sequence (using sequence mediator) from the proxy service, null message is sent to JMS queue.

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="sendtoconsumer" xmlns="http://ws.apache.org/ns/synapse">
<property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
<property expression="//*[name() = 'CONSUMER_REFERENCE']/text()"
name="topic" scope="default" type="STRING"
xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:ns="http://org.apache.synapse/xsd"/>
    <property expression="fn:substring-before($ctx:topic,'//')"
        name="topicval" scope="default" type="STRING"
        xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:ns="http://org.apache.synapse/xsd"/>
    <property
        expression="fn:substring-before(fn:substring-after($ctx:topic,'//'),'@')"
        name="queueName" scope="default" type="STRING"
        xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:ns="http://org.apache.synapse/xsd"/>
    <property expression="fn:substring-after($ctx:topic,'@')"
        name="connectionFactory" scope="default" type="STRING"
        xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:ns="http://org.apache.synapse/xsd"/>
    <log level="custom">
        <property expression="$ctx:pubRequest" name="body" xmlns:ns="http://org.apache.synapse/xsd"/>
        <property expression="$ctx:topic" name="topic" xmlns:ns="http://org.apache.synapse/xsd"/>
        <property expression="$ctx:topicval" name="topicval" xmlns:ns="http://org.apache.synapse/xsd"/>
    </log>
    <switch source="get-property('topicval')" xmlns:ns="http://org.apache.synapse/xsd">
        <case regex="mq:"/>
        <case regex="java:">
            <property
                expression="fn:concat('jms://', $ctx:queueName, '?transport.jms.ConnectionFactoryJNDIName=', $ctx:connectionFactory,'&amp;java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory&amp;java.naming.provider.url=', 't3://localhost:7003,localhost:7004', '&amp;transport.jms.DestinationType=queue')"
                name="endpt" scope="default" type="STRING"/>
            <log level="custom">
                <property expression="$ctx:endpt" name="sendvalue"/>
            </log>
            <header expression="get-property('endpt')" name="To"/>
            <send>
                <endpoint>
                    <default/>
                </endpoint>
            </send>
        </case>
        <case regex="http:"/>
        <default>
            <log level="custom">
                <property expression="$ctx:topic" name="poda"/>
            </log>
        </default>
    </switch>
</sequence>
1
Can you show the part of the proxy where you set the queueName property and where you use the endpt property?ophychius
Try to log property endpt and see is it valid or not. It is really easy to mess in such long line.simar

1 Answers

1
votes

The Xpath Endpoint is a key-expression - i.e., points to a resource - either in the registry, or in the local Endpoints.

What you actually need is a default endpoint and a header "To" with the endpoint value:

<header name="To" expression="get-property('endpt')"/>
<send>
    <endpoint>
        <default/>
    </endpoint>
</send>