[jboss-user] [Messaging, JMS & JBossMQ] - JMSQueueAppender

vinodpol do-not-reply at jboss.com
Tue Dec 12 09:43:22 EST 2006


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

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3993084#3993084

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3993084




More information about the jboss-user mailing list