/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.mq.il.ha.examples; import javax.jms.ExceptionListener; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueReceiver; import javax.jms.QueueSender; import javax.jms.QueueSession; import javax.jms.TextMessage; import javax.jms.Topic; import javax.jms.TopicConnection; import javax.jms.TopicConnectionFactory; import javax.jms.TopicPublisher; import javax.jms.TopicSession; import javax.jms.TopicSubscriber; import javax.naming.InitialContext; import javax.naming.NamingException; import org.jboss.logging.Logger; import org.jboss.system.ServiceMBeanSupport; /** * * Helps to manually test the HAIL * * @author Ivelin Ivanov <ivelin@apache.org> * */ public class HAJMSClient extends ServiceMBeanSupport implements MessageListener, ExceptionListener, HAJMSClientMBean { /** * create connection, sessions and subscribe for topic and queue */ protected void startService() throws Exception { connect(); } /** * unsubscribe from topic, queue, * stop sessions and connection */ protected void stopService() throws Exception { disconnect(); } /** * Acknowledges connenction exception. * Should be invoked every time the HAIL singleton moves. */ public void onException(JMSException connEx) { log.info("Notification received by ExceptionListener. Singleton Probably Moved."); try { reconnect(); } catch (Exception e) { e.printStackTrace(); } finally { connectionException_ = connEx; } } protected void reconnect() throws NamingException, JMSException { log.info("Reconnecting"); try { disconnect(); } finally { connect(); } } public void connect() throws NamingException, JMSException { log.info("Connecting"); InitialContext iniCtx = new InitialContext(); Object tmp = iniCtx.lookup("HAILXAConnectionFactory"); TopicConnectionFactory tcf = (TopicConnectionFactory)tmp; topicConn_ = tcf.createTopicConnection(); topic_ = (Topic)iniCtx.lookup("topic/testTopic"); topicSession_ = topicConn_.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE); topicConn_.setExceptionListener(this); topicSub_ = topicSession_.createSubscriber(topic_); topicSub_.setMessageListener( this ); topicPub_ = topicSession_.createPublisher(topic_); topicConn_.start(); QueueConnectionFactory qcf = (QueueConnectionFactory)tmp; qConn_ = qcf.createQueueConnection(); q_ = (Queue)iniCtx.lookup("queue/testQueue"); qSession_ = qConn_.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); qRecv_ = qSession_.createReceiver(q_); qRecv_.setMessageListener( this ); qSend_ = qSession_.createSender(q_); qConn_.start(); log.info("Connected"); } public void disconnect() throws JMSException { if (topicConn_ == null) return; log.info("Disconnecting"); connectionException_ = null; try { topicConn_.setExceptionListener(null); topicSub_.close(); topicPub_.close(); topicConn_.stop(); topicSession_.close(); qRecv_.close(); qSend_.close(); qConn_.stop(); qSession_.close(); } finally { try { topicConn_.close(); } finally { topicConn_ = null; try { qConn_.close(); } finally { qConn_ = null; } } } log.info("Disconnected"); } /** * Handle JMS message * * @see javax.jms.MessageListener#onMessage(javax.jms.Message) */ public void onMessage(Message msg) { lastMessage_ = (TextMessage)msg; log.info("Message received: " + msg); } public String getLastMessage() throws JMSException { if (lastMessage_ == null) return null; return lastMessage_.getText(); } public String getConnectionException() { if (connectionException_ == null) return null; return connectionException_.toString(); } public void publishMessageToTopic(String text) throws JMSException { TextMessage msg = topicSession_.createTextMessage(text); topicPub_.publish(msg); log.info("HA JMS message published to topic: " + text); } public void sendMessageToQueue(String text) throws JMSException { TextMessage msg = qSession_.createTextMessage(text); qSend_.send(msg); log.info("HA JMS message sent to queue: " + text); } private Topic topic_; private TopicSession topicSession_; private TopicConnection topicConn_; private JMSException connectionException_; private TopicSubscriber topicSub_; private TopicPublisher topicPub_; private TextMessage lastMessage_; private Queue q_; private QueueConnection qConn_; private QueueSession qSession_; private QueueReceiver qRecv_; private QueueSender qSend_; private static Logger log = Logger.getLogger(HAJMSClient.class); }