[jboss-user] [JBoss Messaging Users] - Nullpointer while creating a remote JMS Session

belcar do-not-reply at jboss.com
Wed Sep 30 05:47:53 EDT 2009


Hi all

My JMS client application running on JBoss 4.2.3 fails to create a remote JMS Session on startup due to a NullpointerException.  The JMS server is JBM 1.4.4 on JBoss AS 4.2.3.  Threads mentioned below already discuss the issue, but even when trying to change the scoping/loader the issue remains.

13:37:18,980 INFO  [StartupListener]   ~~ Creating JMS Session ...
  | 13:37:18,989 FATAL [StartupListener]
  | java.lang.NullPointerException
  |         at org.jboss.jms.client.container.FailoverValveInterceptor.invoke(FailoverValveInterceptor.j
  | ava:87)
  |         at org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:105)
  |         at org.jboss.jms.client.delegate.ClientConnectionDelegate$createSessionDelegate_605233526772
  | 4906805.invokeNext(ClientConnectionDelegate$createSessionDelegate_6052335267724906805.java)
  |         at org.jboss.jms.client.container.ClosedInterceptor.invoke(ClosedInterceptor.java:170)
  |         at org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:105)
  |         at org.jboss.jms.client.delegate.ClientConnectionDelegate$createSessionDelegate_605233526772
  | 4906805.invokeNext(ClientConnectionDelegate$createSessionDelegate_6052335267724906805.java)
  |         at org.jboss.jms.client.delegate.ClientConnectionDelegate.createSessionDelegate(ClientConnec
  | tionDelegate.java)
  |         at org.jboss.jms.client.JBossConnection.createSessionInternal(JBossConnection.java:269)
  |         at org.jboss.jms.client.JBossConnection.createSession(JBossConnection.java:91)

This standalone WAR file connects to the JBM server from the ServletContextListener.contextInitialized() callback method to poll for messages.  The code was tested on windows platform(on 1 machine) but now fails during linux deployments where both servers are remote.

http://www.jboss.org/index.html?module=bb&op=viewtopic&t=110051&postdays=0&postorder=asc&start=0
https://jira.jboss.org/jira/browse/JBMESSAGING-980
http://www.jboss.org/community/wiki/ClassLoadingconfiguration 

On the client server I removed the server/default/deploy/jms folder to remove JBossMQ.  In the WEB-INF/lib of my WAR I've provided jboss-remoting.jar (v2.2.3) and jboss-messaging-client.jar (v1.4.4).

Here is my Spring configuration:
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
  |     <property name="environment">
  |       <props>
  |         <prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop>
  |         <prop key="java.naming.provider.url">jnp://someIP:1099</prop>
  |         <prop key="java.naming.factory.url.pkgs">org.jboss.naming:org.jnp.interfaces</prop>         
  |       </props>
  |     </property>
  |   </bean>
  |   
  |   <bean id="threadPoolSize" class="java.lang.Integer">
  |     <constructor-arg value="${threadPoolSize}"/>
  |   </bean>
  |   
  |   <bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
  |     <property name="jndiTemplate"><ref bean="jndiTemplate" /></property>
  |     <property name="jndiName" value="/ConnectionFactory"/>
  |   </bean>
  |   
  |   <bean id="requestQueue" class="org.springframework.jndi.JndiObjectFactoryBean">
  |     <property name="jndiTemplate"><ref bean="jndiTemplate" /></property>
  |     <property name="jndiName" value="${queue}"/>
  |   </bean>	
 
and here is the code that initializes the connection:

public class StartupListener implements ServletContextListener {
  | 	private static final Log log = LogFactory.getLog(StartupListener.class);
  | 	private static Connection connection;
  | 	private static Session session;
  | 	private static MessageConsumer consumer;
  | 	private static Boolean run = Boolean.TRUE;
  | 	private static ExecutorService pool;
  | 	private static Thread daemonThread;
  | 	private static final String PREFIX = "  ~~ ";
  | 	private static MeteoService metService;
  | 
  | 	/**
  | 	 * Startup trigger of the application.
  | 	 */
  | 	public void contextInitialized(ServletContextEvent ctx) {
  | 		log.info("==== Initializing ServiceBroker");
  | 
  | 		logInfo("Creating polling thread ...");
  | 		daemonThread = new Thread(new MessageDispatcher());
  | 
  | 		try {
  | 			ApplicationContext _ctx = WebApplicationContextUtils.getWebApplicationContext(ctx.getServletConte
  | xt());
  | 			initializeWorkerThreadPool(_ctx);
  | 			initializeJMSEnvironment(_ctx);
  | 
  | 			metService = (MeteoService) _ctx.getBean("metService");
  | 
  | 			logInfo("Starting the Session ...");
  | 			connection.start();
  | 
  | 			logInfo("Starting a Daemon Thread responsible for message dispatching ...");
  | 			daemonThread.start();
  | 
  | 			log.info("==== ServiceBroker initialized successfully");
  | 		} catch (Throwable e) {
  | 			log.fatal(e.getMessage(), e);
  | 		}
  | 	}
  | 
  | 	/**
  | 	 * This is a context lifecycle (callback) method.
  | 	 * The Servlet Context is being destroyed by the Container due to a shutdown.
  | 	 * As a result we need to clean up our privately managed resources.
  | 	 */
  | 	public void contextDestroyed(ServletContextEvent ctx) {
  | 		synchronized (run) {
  | 			log.info("==== Shutting down PilotBriefing ServiceBroker ...");
  | 			run = Boolean.FALSE;
  | 
  | 			logInfo("Interrupting polling thread ...");
  | 			daemonThread.interrupt();
  | 
  | 			if (session != null) {
  | 				try {
  | 					logInfo("Closing JMS Session ...");
  | 					session.close();
  | 				} catch (JMSException e) {
  | 					log.error(e.getMessage(), e);
  | 				}
  | 			}
  | 
  | 			if (connection != null) {
  | 				try {
  | 					logInfo("Closing JMS Connection ...");
  | 					connection.close();
  | 				} catch (JMSException e) {
  | 					log.error(e.getMessage(), e);
  | 				}
  | 			}
  | 
  | 			if (pool != null) {
  | 				logInfo("Shutting down ThreadPool");
  | 				pool.shutdownNow();
  | 			}
  | 
  | 			log.info("==== ServiceBroker shutdown complete");
  | 		}
  | 	}
  | 
  | 	private void logInfo(String msg) {
  | 		log.info(PREFIX + msg);
  | 	}
  | 
  | 	/**
  | 	 * Initialization of JMS environment.
  | 	 * @param _ctx external configuration parameters
  | 	 * @throws NamingException
  | 	 * @throws JMSException
  | 	 */
  | 	private void initializeJMSEnvironment(ApplicationContext _ctx) throws NamingException, JMSException
  |  {
  | 		Queue queue = (Queue) _ctx.getBean("requestQueue");
  | 
  | 		logInfo("Lookup of ConnectionFactory ...");
  | 		ConnectionFactory cf = (ConnectionFactory) _ctx.getBean("jmsConnectionFactory");
  | 
  | 		logInfo("Creating JMS Connection ...");
  | 		connection = cf.createConnection();
  | 
  | 		logInfo("Creating JMS Session ...");
  | 		session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  | 
  | 		logInfo("Creating MessagConsumer ...");
  | 		consumer = session.createConsumer(queue);
  | 	}
  | 
  | 	/**
  | 	 * Setup a pool of worker threads for message handling.
  | 	 * @param _ctx external configuration parameters
  | 	 */
  | 	private void initializeWorkerThreadPool(ApplicationContext _ctx) {
  | 		int poolSize = (Integer) _ctx.getBean("threadPoolSize");
  | 		logInfo("Initializing Thread Pool [#" + poolSize + "] ...");
  | 		pool = Executors.newFixedThreadPool(poolSize);
  | 	}
  | 
  | 	/**
  | 	 * Daemon thread for the dispatching of incoming messages to a pooled Worker Thread that will handl
  | e the request.
  | 	 * This class is implemented as a Thread because otherwise the Servlet Container Thread that execut
  | es this listener class, 
  | 	 * fails to complete as a result of the polling-loop. 
  | 	 */
  | 	class MessageDispatcher implements Runnable {
  | 		public void run() {
  | 			try {
  | 				while (run) {
  | 					TextMessage message = (TextMessage) consumer.receive();
  | 					if (message != null) {
  | 						JMSUtils.printMessage("Received request", message);
  | 						pool.execute(createMessageHandler(message));
  | 					}
  | 				}
  | 			} catch (Throwable t) {
  | 				log.error(t.getMessage(), t);
  | 			}
  | 		}
  | 
  | 		/**
  | 		 * Factory method.
  | 		 * @param message
  | 		 * @return
  | 		 * @throws JMSException
  | 		 */
  | 		private Runnable createMessageHandler(TextMessage message) throws JMSException {
  | 			return new MessageHandler(metService, session, message.getJMSReplyTo(), message.getJMSMessageID()
  | , message.getText());
  | 		}
  | 	}	

I've searched and tried every possible thing but I cannot get past this issue.  Any help is much appreciated.

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

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



More information about the jboss-user mailing list