import javax.jms.*; import javax.naming.*; import java.util.Properties; import java.io.*; public class JMSConsumeMessage { public static void main(String[] args) throws Exception { if (args.length < 5 || args.length > 6) { System.out.println ("Usage: TOPIC|QUEUE ProviderURL UserName Password DestName [subscriptionName]"); return; } String destType = args[0]; String provider = args[1]; String username = args[2]; String password = args[3]; String destName = args[4]; String subscriptionName = null; if (args.length == 6) subscriptionName = args[5]; if (!(destType.equals("QUEUE") || destType.equals("TOPIC"))) throw new Exception ("Must specify destination as TOPIC or QUEUE"); Properties props = System.getProperties(); props.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory"); props.put(Context.PROVIDER_URL, provider); props.put(Context.SECURITY_PRINCIPAL, username); props.put(Context.SECURITY_CREDENTIALS, password); InitialContext ctx = new InitialContext(props); Session session = null; MessageConsumer consumer = null; Connection connection = null; try { if (destType.equals("TOPIC")) { TopicConnectionFactory tconfactory = (TopicConnectionFactory)ctx.lookup("javax.jms.TopicConnectionFactory"); TopicConnection tcon = tconfactory.createTopicConnection(); if (subscriptionName != null) tcon.setClientID(subscriptionName); TopicSession tsession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); Topic topic = (Topic)ctx.lookup(destName); TopicSubscriber tsubscriber = (subscriptionName == null ? tsession.createSubscriber(topic) : tsession.createDurableSubscriber(topic,subscriptionName)); session = (Session)tsession; consumer = (MessageConsumer)tsubscriber; connection = (Connection)tcon; } else if (destType.equals("QUEUE")) { QueueConnectionFactory qconfactory = (QueueConnectionFactory)ctx.lookup("javax.jms.QueueConnectionFactory"); QueueConnection qcon = qconfactory.createQueueConnection(); QueueSession qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = (Queue)ctx.lookup(destName); QueueReceiver qreceiver = qsession.createReceiver(queue); session = (Session)qsession; consumer = (MessageConsumer)qreceiver; connection = (Connection)qcon; } connection.start(); int currentIndex = 0; while (true) { Message m = consumer.receive(); if (m instanceof TextMessage) { TextMessage txt = (TextMessage)m; BufferedWriter writer = new BufferedWriter(new FileWriter(destName + "-" + currentIndex + ".txt")); writer.write(txt.getText()); writer.close(); System.out.println("Read message to: " + destName + "-" + currentIndex + ".txt"); currentIndex++; } } } finally { if (consumer != null) consumer.close(); if (session != null) session.close(); if (connection != null) connection.close(); } } }
Wednesday, 7 September 2011
Weblogic JMS message receiver
Following on from an earlier post where I wrote a quick piece of java to put files onto an arbitrary JMS topic/queue, I also wanted something to read text documents off a topic/queue. I wrote the following code that takes a topic/queue and continues to read messages off of it, it also supports durable topic subscription IDs.
Remember to include wlclient.jar, wljmsclient.jar in the classpath when building/running this (todo: mavenize all of these Weblogic libraries).
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment