[jboss-user] [EJB 3.0] - EJB Timer still active even after the bean is undeployed !

Nouredine13 do-not-reply at jboss.com
Tue Mar 3 10:01:42 EST 2009


Hello,

i have the following problem:
	
I can not kill an ejb timer after the call unregisterTimer method, and the timer is still active even after the ejb is undeployed.

the source code of my bean is here under :


  | package com.test.timer;
  | 
  | import javax.annotation.PreDestroy;
  | import javax.annotation.Resource;
  | import javax.ejb.EJBException;
  | import javax.ejb.Local;
  | import javax.ejb.NoSuchObjectLocalException;
  | import javax.ejb.Remote;
  | import javax.ejb.SessionContext;
  | import javax.ejb.Stateless;
  | import javax.ejb.Timeout;
  | import javax.ejb.Timer;
  | import javax.ejb.TimerHandle;
  | import javax.ejb.TimerService;
  | import javax.ejb.TransactionAttribute;
  | import javax.ejb.TransactionAttributeType;
  | import javax.ejb.TransactionManagement;
  | import javax.ejb.TransactionManagementType;
  | import javax.naming.Context;
  | import javax.naming.InitialContext;
  | import javax.naming.NamingException;
  | 
  | import org.apache.log4j.Logger;
  | 
  | 
  | 
  | 	
  | 	@Local( ITimerManagerLocal.class)
  | 	@Remote(ITimerManagerRemote.class)
  | 	@TransactionManagement(TransactionManagementType.CONTAINER)
  | 	@TransactionAttribute(TransactionAttributeType.SUPPORTS)
  | 	@Stateless( name = "NotifyExpiration", mappedName="NotifyExpirationRemote")
  | 	public class TimerManagerBean implements ITimerManagerLocal, ITimerManagerRemote {
  | 		
  | 
  | 		private static final Logger logger = Logger.getLogger ( "EXPIRATION_SERVICE");		
  | 		
  | 		@Resource
  | 		private SessionContext sessionContext;
  | 
  | 	    @Resource
  | 	    private TimerService timerService;
  | 		
  | 	  //--------------------------------------------------------------------------
  | 		// Methods
  | 		//--------------------------------------------------------------------------
  | 		@PreDestroy
  | 		public void unregisterTimer() throws NamingException {
  | 			
  | 				logger.info( "NOTIFY TIMEOUT UNREGISTER");
  | 			
  | 			Context ctx = new InitialContext();
  | 			
  | 			try {
  | 				TimerHandle handle = (TimerHandle) ctx.lookup( "TIMER_JNDI_NAME");
  | 				ctx.unbind("TIMER_JNDI_NAME");
  | 				if (handle != null){
  | 					try {
  | 						Timer expirationTimer = handle.getTimer();
  | 						if (expirationTimer != null){
  | 							expirationTimer.cancel();
  | 						}
  | 					} catch (NoSuchObjectLocalException e) {
  | 						logger.warn( "UNABLE TO UNREGISTER TIME OUT", e);
  | 					} catch (IllegalStateException e) {
  | 						logger.warn( "UNABLE TO UNREGISTER TIME OUT", e);
  | 					} catch (EJBException e) {
  | 						logger.warn( "UNABLE TO UNREGISTER TIME OUT" , e);
  | 					}
  | 				}
  | 			} catch (Throwable thre){
  | 				logger.warn( "UNABLE TO UNREGISTER TIME OUT", thre);
  | 				return;
  | 			}
  | 		}
  | 	
  | 		
  | 		public void registerTimer() throws NamingException {
  | 			unregisterTimer();
  | 			int delai =  10 * 1000;
  | 			Timer expirationTimer = createTimer( delai);
  | 			Context ctx = new InitialContext();
  | 			ctx.bind("TIMER_JNDI_NAME", expirationTimer.getHandle());
  | 			if (logger.isInfoEnabled()){
  | 				logger.info("TIMER REGISTERED " + expirationTimer.getNextTimeout().getTime());
  | 	                
  | 			}
  | 		}
  | 	
  | 		private Timer createTimer( int delai)
  | 		{
  | 		    try {
  | 	            return sessionContext.getTimerService().createTimer(delai, delai, null);
  | 		    } catch( Throwable thr) {
  | 		        return timerService.createTimer (delai, delai, null);
  | 		    }	    
  | 		}
  | 	
  | 		@Timeout
  | 		//@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
  | 		public void  timedOut(Timer obj)
  | 		{
  | 			try {
  | 				if (logger.isDebugEnabled()){
  | 					logger.debug( 
  | 							String.format("TIMER WAKEUP at: " + System.currentTimeMillis()));
  | 					
  | 				}
  | 				logger.debug("do something...");
  | 			}catch (RuntimeException e) {
  | 				logger.debug( "TIMER WAKEUP FAILS");
  | 			}
  | 		}
  | 		
  | 		
  | }
  | 
  | 

so first i register the timer by calling registerTimer() method, and i wont to kill it by calling unregisterTimer() method. but this does not work, and the timer remains active even after the bean is undeployed.

If somme one has an idea or workaround to solve this problem ?

Thank you so match.

Regard's.

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

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



More information about the jboss-user mailing list