Saturday, April 28, 2012

Testing Physical Destinations belonging to Distributed Queues

I need to send a JMS message to a specific Queue part of a Distributed Queue.
If I send a message to a Distributed Queue, I have no control on which specific instance of the Queue, on which JMSServer, the message will go.

When you target a Distributed Queue "MyQ" to a cluster, this gets created in the JNDI tree of each Managed Server in the cluster:

The Distributed Queue:
Class: weblogic.jms.common.DistributedDestinationImpl
Binding Name: jms.jndi.dq.MyQ

The actual instance in the JMSServer running in the Managed Server:
Class: weblogic.jms.common.DestinationImpl
Binding Name = CommonJmsServer1@jms.jndi.dq.MyQ

So, you must bind to "CommonJmsServer1@jms.jndi.dq.MyQ" to send to only that JMSServer.

Example of WLST script to send to multiple physical destinations:

from javax.naming import Context, InitialContext
from weblogic.jndi import WLInitialContextFactory
from javax.jms import QueueSession, Queue, Session

msservers=["myhost1:8001", "myhost2:8001", "myhost3:8001", "myhost4:8001"]
jmsservers=["CommonJmsServer1", "CommonJmsServer2", "CommonJmsServer3", "CommonJmsServer4"]

jmsQueueJNDIs=["jms.jndi.dq.AQ", "jms.jndi.dq.BQ"];

for i in range(len(msservers)):
    msserver = msservers[i] 
    jmsserver = jmsservers[i]
    properties = Properties()
    properties[Context.PROVIDER_URL] = "t3://" + msserver
    properties[Context.INITIAL_CONTEXT_FACTORY] =
    print "connecting to " + msserver + "..."
    ctx = InitialContext(properties)
    print "successfully connected to ", msserver
    connectionFactory = ctx.lookup("weblogic/jms/XAConnectionFactory" )
    queueCon = connectionFactory.createQueueConnection();
    queueSession = queueCon.createQueueSession( false, Session.AUTO_ACKNOWLEDGE );
    for jmsqueue in jmsQueueJNDIs:
        theJNDI = jmsserver + "@" + jmsqueue
        queue = ctx.lookup(theJNDI)
        sender = queueSession.createSender( queue );
        msg = queueSession.createTextMessage( "I am a pig" );
        msg.setStringProperty("ISTEST", "true");
        print "sending message to " + theJNDI
        sender.send( msg );

See also:

No comments: