0 Replies Latest reply on Dec 12, 2006 9:43 AM by VInod Pol

    JMSQueueAppender

    VInod Pol Newbie

      I Have Used... JMSQueueAppender

      import org.apache.log4j.AppenderSkeleton;
      import org.apache.log4j.spi.LoggingEvent;
      import org.apache.log4j.spi.ErrorHandler;
      import org.apache.log4j.spi.ErrorCode;
      import org.apache.log4j.helpers.LogLog;

      import java.util.Hashtable;
      import java.util.Properties;
      import javax.jms.*;
      import javax.naming.InitialContext;
      import javax.naming.Context;
      import javax.naming.NameNotFoundException;
      import javax.naming.NamingException;

      /**
      * A Simple JMS (P2P) Queue Appender.
      *
      * @author Ceki Gülcü
      * @author Jamie Tsao
      */
      public class JMSQueueAppender1 extends AppenderSkeleton {

      protected QueueConnection queueConnection;
      protected QueueSession queueSession;
      protected QueueSender queueSender;
      protected Queue queue;

      String initialContextFactory;
      String providerUrl;
      String queueBindingName;
      String queueConnectionFactoryBindingName;

      public
      JMSQueueAppender1() {
      }


      /**
      * The InitialContextFactory option takes a string value.
      * Its value, along with the ProviderUrl option will be used
      * to get the InitialContext.
      */
      public void setInitialContextFactory(String initialContextFactory) {
      this.initialContextFactory = initialContextFactory;
      }

      /**
      * Returns the value of the InitialContextFactory option.
      */
      public String getInitialContextFactory() {
      return initialContextFactory;
      }

      /**
      * The ProviderUrl option takes a string value.
      * Its value, along with the InitialContextFactory option will be used
      * to get the InitialContext.
      */
      public void setProviderUrl(String providerUrl) {
      this.providerUrl = providerUrl;
      }

      /**
      * Returns the value of the ProviderUrl option.
      */
      public String getProviderUrl() {
      return providerUrl;
      }

      /**
      * The QueueConnectionFactoryBindingName option takes a
      * string value. Its value will be used to lookup the appropriate
      * QueueConnectionFactory from the JNDI context.
      */
      public void setQueueConnectionFactoryBindingName(String queueConnectionFactoryBindingName) {
      this.queueConnectionFactoryBindingName = queueConnectionFactoryBindingName;
      }

      /**
      * Returns the value of the QueueConnectionFactoryBindingName option.
      */
      public String getQueueConnectionFactoryBindingName() {
      return queueConnectionFactoryBindingName;
      }

      /**
      * The QueueBindingName option takes a
      * string value. Its value will be used to lookup the appropriate
      * destination Queue from the JNDI context.
      */
      public void setQueueBindingName(String queueBindingName) {
      this.queueBindingName = queueBindingName;
      }

      /**
      Returns the value of the QueueBindingName option.
      */
      public String getQueueBindingName() {
      return queueBindingName;
      }


      /**
      * Overriding this method to activate the options for this class
      * i.e. Looking up the Connection factory ...
      */
      public void activateOptions() {

      QueueConnectionFactory queueConnectionFactory;

      try {

      Context ctx = getInitialContext();
      queueConnectionFactory = (QueueConnectionFactory) ctx.lookup(queueConnectionFactoryBindingName);
      queueConnection = queueConnectionFactory.createQueueConnection();

      queueSession = queueConnection.createQueueSession(false,
      Session.AUTO_ACKNOWLEDGE);

      Queue queue = (Queue) ctx.lookup(queueBindingName);
      queueSender = queueSession.createSender(queue);

      queueConnection.start();

      ctx.close();

      } catch(Exception e) {
      errorHandler.error("Error while activating options for appender named ["+name+
      "].", e, ErrorCode.GENERIC_FAILURE);
      }
      }

      protected InitialContext getInitialContext() throws NamingException {
      try {
      Hashtable ht = new Hashtable();

      //Populate property hashtable with data to retrieve the context.
      ht.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory);
      ht.put(Context.PROVIDER_URL, providerUrl);

      return (new InitialContext(ht));

      } catch (NamingException ne) {
      LogLog.error("Could not get initial context with ["+initialContextFactory + "] and [" + providerUrl + "].");
      throw ne;
      }
      }


      protected boolean checkEntryConditions() {

      String fail = null;

      if(this.queueConnection == null) {
      fail = "No QueueConnection";
      } else if(this.queueSession == null) {
      fail = "No QueueSession";
      } else if(this.queueSender == null) {
      fail = "No QueueSender";
      }

      if(fail != null) {
      errorHandler.error(fail +" for JMSQueueAppender named ["+name+"].");
      return false;
      } else {
      return true;
      }
      }

      /**
      * Close this JMSQueueAppender. Closing releases all resources used by the
      * appender. A closed appender cannot be re-opened.
      */
      public synchronized // avoid concurrent append and close operations
      void close() {

      if(this.closed)
      return;

      LogLog.debug("Closing appender ["+name+"].");
      this.closed = true;

      try {
      if(queueSession != null)
      queueSession.close();
      if(queueConnection != null)
      queueConnection.close();
      } catch(Exception e) {
      LogLog.error("Error while closing JMSQueueAppender ["+name+"].", e);
      }

      // Help garbage collection
      queueSender = null;
      queueSession = null;
      queueConnection = null;
      }

      /**
      * This method called by {@link AppenderSkeleton#doAppend} method to
      * do most of the real appending work. The LoggingEvent will be
      * be wrapped in an ObjectMessage to be put on the JMS queue.
      */
      public void append(LoggingEvent event) {

      if(!checkEntryConditions()) {
      return;
      }

      try {

      ObjectMessage msg = queueSession.createObjectMessage();
      msg.setObject(event);
      queueSender.send(msg);

      } catch(Exception e) {
      errorHandler.error("Could not send message in JMSQueueAppender ["+name+"].", e,
      ErrorCode.GENERIC_FAILURE);
      }
      }

      public boolean requiresLayout() {
      return false;
      }
      }



      in log4j.xml i have used...
      appender name="JMS" class="JMSQueueAppender1"
      param name="InitialContextFactory" value="org.jnp.interfaces.NamingContextFactory"
      param name="ProviderUrl" value="jnp://localhost:1099"/
      param name="QueueConnectionFactoryBindingName" value="QueueConnectionFactory"/
      param name="QueueBindingName" value="queue/testQueue"
      appender


      it is giving error.....

      log4j:ERROR Error while activating options for appender named [JMS].
      javax.naming.CommunicationException: Could not obtain connection to any of these
      urls: 10.10.10.252:1099 and discovery failed with error: javax.naming.Communica
      tionException: Receive timed out [Root exception is java.net.SocketTimeoutExcept
      ion: Receive timed out] [Root exception is javax.naming.CommunicationException:
      Failed to connect to server 10.10.10.252:1099 [Root exception is javax.naming.Se
      rviceUnavailableException: Failed to connect to server 10.10.10.252:1099 [Root e
      xception is java.net.ConnectException: Connection refused: connect]]]


      Can AnyBody Help me out.... Any help will be appreciated.....