2 Replies Latest reply on Dec 12, 2006 12:26 PM by VInod Pol

    How to Configure JMS Appender

    VInod Pol Newbie

      Can Anybody tell me how to configure JMSAppender in Jboss so that it can log in JMS Queue using log4j.xml

        • 1. Re: How to Configure JMS Appender
          Elias Ross Master

          This is really a log4j question.

          • 2. Re: How to Configure JMS Appender
            VInod Pol Newbie

            i have used ....

            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;
            }
            }



            with log4j.xml settings

            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



            But receiving 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...

            Regards
            vinod_pol@yahoo.com