Hello,
I am using the timer service from the EJB 2.1 spec, using Jboss 4 DR 3. It works, as
far as the ejbtimeout is called, but after that, an exception with a very big
exception trace occurs.
I know it is a development release, I post this because it might have some added value
for the developer.
May Timed Bean:
| /**
| *
| *SkuTimerBean.java
| *
| *Created on 30-mrt-2004
| *
| * * Copyright (c) MP Objects
| * All rights reserved
| * @author Kees van Dieren
| * $Id: $
| */
| package com.mpobjects.ime.core.ejb;
|
| import java.rmi.RemoteException;
|
| import javax.ejb.CreateException;
| import javax.ejb.EJBException;
| import javax.ejb.SessionBean;
| import javax.ejb.SessionContext;
| import javax.ejb.TimedObject;
| import javax.ejb.Timer;
|
| /**
| * @ejb.bean name="SkuTimer"
| * jndi-name="SkuTimerBean"
| * type="Stateless"
| *
|
| **/
|
| public class SkuTimerBean implements SessionBean, TimedObject {
|
| private SessionContext theContext;
|
| private Timer theTimer;
|
| /**
| * @ejb.create-method
| * view-type="local"
| **/
| public void ejbCreate() throws CreateException {}
|
|
| /**
| * @ejb.interface-method
| * view-type="local"
| **/
| public void startTimer() {
| System.out.println("SkuTimerBean.startTimer called");
| this.theTimer = this.theContext.getTimerService().createTimer(10 * 1000,
"Created the timer");
| System.out.println("SkuTimerBean.startTimer: timer started");
| }
|
| /**
| * @ejb.interface-method
| * view-type="local"
| **/
| public void stopTimer(){
| if (this.theTimer != null)
| this.theTimer.cancel();
| }
|
| public void ejbTimeout(Timer aTimer) {
| System.out.println("SkuTimerBean.ejbTimeout called");
| }
|
| public void ejbActivate() throws EJBException, RemoteException {
| System.out.println("skuTimerBean.ejbActivate");
| }
|
| public void ejbPassivate() throws EJBException, RemoteException {
| System.out.println("skuTimerBean.ejbPassivate");
| }
|
| public void ejbRemove() throws EJBException, RemoteException { }
|
| public void setSessionContext(SessionContext aContext) throws EJBException,
| RemoteException {
| this.theContext = aContext;
| }
| }
|
[hr/]
Call of the bean (using localhome interface):
| try
| {
| (SkuTimerUtil.getLocalHome().create()).startTimer();
| }
| catch(Throwable myEx) {
| myEx.printStackTrace();
| }
|
The code of SkuTimerUtil:
| /**
| *
| *SkuTimerUtil.java
| *
| *Created on 30-mrt-2004
| *
| * * Copyright (c) MP Objects
| * All rights reserved
| * @author Kees van Dieren
| * $Id: $
| */
| package com.mpobjects.ime.core.ejb;
|
|
| /**
| * Created on 30-mrt-2004
| *
| * Copyright (c) MP Objects 1999 - 2004
| * All rights reserved
| * @author Kees van Dieren <[EMAIL PROTECTED]>
| * com.mpobjects.ime.core.ejb.SkuTimerUtil
| *
| * @todo add documentation for com.mpobjects.ime.core.ejb.SkuTimerUtil
| */
| public class SkuTimerUtil {
| /** Cached remote home (EJBHome). Uses lazy loading to obtain its value
(loaded by getHome() methods). */
| private static com.mpobjects.ime.core.ejb.SkuTimerHome cachedRemoteHome = null;
|
| /** Cached local home (EJBLocalHome). Uses lazy loading to obtain its value
(loaded by getLocalHome() methods). */
| private static com.mpobjects.ime.core.ejb.SkuTimerLocalHome cachedLocalHome =
null;
|
| // Home interface lookup methods
|
| /**
| * Obtain remote home interface from default initial context
| * @return Home interface for SkuTimer. Lookup using COMP_NAME
| */
| public static com.mpobjects.ime.core.ejb.SkuTimerHome getHome() throws
javax.naming.NamingException
| {
| if (cachedRemoteHome == null) {
| // Obtain initial context
| javax.naming.InitialContext initialContext = new
javax.naming.InitialContext();
| try {
| java.lang.Object objRef =
initialContext.lookup(com.mpobjects.ime.core.ejb.SkuTimerHome.COMP_NAME);
| cachedRemoteHome = (com.mpobjects.ime.core.ejb.SkuTimerHome)
javax.rmi.PortableRemoteObject.narrow(objRef,
com.mpobjects.ime.core.ejb.SkuTimerHome.class);
| } finally {
| initialContext.close();
| }
| }
| return cachedRemoteHome;
| }
|
| /**
| * Obtain remote home interface from parameterised initial context
| * @param environment Parameters to use for creating initial context
| * @return Home interface for SkuTimer. Lookup using COMP_NAME
| */
| public static com.mpobjects.ime.core.ejb.SkuTimerHome getHome(
java.util.Hashtable environment ) throws javax.naming.NamingException
| {
| // Obtain initial context
| javax.naming.InitialContext initialContext = new
javax.naming.InitialContext(environment);
| try {
| java.lang.Object objRef =
initialContext.lookup(com.mpobjects.ime.core.ejb.SkuTimerHome.COMP_NAME);
| return (com.mpobjects.ime.core.ejb.SkuTimerHome)
javax.rmi.PortableRemoteObject.narrow(objRef,
com.mpobjects.ime.core.ejb.SkuTimerHome.class);
| } finally {
| initialContext.close();
| }
| }
|
| /**
| * Obtain local home interface from default initial context
| * @return Local home interface for SkuTimer. Lookup using COMP_NAME
| */
| public static com.mpobjects.ime.core.ejb.SkuTimerLocalHome getLocalHome()
throws javax.naming.NamingException
| {
| // Local homes shouldn't be narrowed, as there is no RMI involved.
| if (cachedLocalHome == null) {
| // Obtain initial context
| javax.naming.InitialContext initialContext = new
javax.naming.InitialContext();
| try {
| cachedLocalHome = (com.mpobjects.ime.core.ejb.SkuTimerLocalHome)
initialContext.lookup(com.mpobjects.ime.core.ejb.SkuTimerLocalHome.JNDI_NAME);
| } finally {
| initialContext.close();
| }
| }
| return cachedLocalHome;
| }
|
| /** Cached per JVM server IP. */
| private static String hexServerIP = null;
|
| // initialise the secure random instance
| private static final java.security.SecureRandom seeder = new
java.security.SecureRandom();
|
| /**
| * A 32 byte GUID generator (Globally Unique ID). These artificial keys SHOULD
<strong>NOT </strong> be seen by the user,
| * not even touched by the DBA but with very rare exceptions, just manipulated
by the database and the programs.
| *
| * Usage: Add an id field (type java.lang.String) to your EJB, and add
setId(XXXUtil.generateGUID(this)); to the ejbCreate method.
| */
| public static final String generateGUID(Object o) {
| StringBuffer tmpBuffer = new StringBuffer(16);
| if (hexServerIP == null) {
| java.net.InetAddress localInetAddress = null;
| try {
| // get the inet address
| localInetAddress = java.net.InetAddress.getLocalHost();
| }
| catch (java.net.UnknownHostException uhe) {
| System.err.println("SkuTimerUtil: Could not get the local IP
address using InetAddress.getLocalHost()!");
| // todo: find better way to get around this...
| uhe.printStackTrace();
| return null;
| }
| byte serverIP[] = localInetAddress.getAddress();
| hexServerIP = hexFormat(getInt(serverIP), 8);
| }
| String hashcode = hexFormat(System.identityHashCode(o), 8);
| tmpBuffer.append(hexServerIP);
| tmpBuffer.append(hashcode);
|
| long timeNow = System.currentTimeMillis();
| int timeLow = (int)timeNow & 0xFFFFFFFF;
| int node = seeder.nextInt();
|
| StringBuffer guid = new StringBuffer(32);
| guid.append(hexFormat(timeLow, 8));
| guid.append(tmpBuffer.toString());
| guid.append(hexFormat(node, 8));
| return guid.toString();
| }
|
| private static int getInt(byte bytes[]) {
| int i = 0;
| int j = 24;
| for (int k = 0; j >= 0; k++) {
| int l = bytes[k] & 0xff;
| i += l << j;
| j -= 8;
| }
| return i;
| }
|
| private static String hexFormat(int i, int j) {
| String s = Integer.toHexString(i);
| return padHex(s, j) + s;
| }
|
| private static String padHex(String s, int i) {
| StringBuffer tmpBuffer = new StringBuffer();
| if (s.length() < i) {
| for (int j = 0; j < i - s.length(); j++) {
| tmpBuffer.append('0');
| }
| }
| return tmpBuffer.toString();
| }
| }
|
Code of LocalHome interface:
| /*
| * Generated by XDoclet - Do not edit!
| */
| package com.mpobjects.ime.core.ejb;
|
| /**
| * Local home interface for SkuTimer.
| * @lomboz generated
| */
| public interface SkuTimerLocalHome
| extends javax.ejb.EJBLocalHome
| {
| public static final String COMP_NAME="java:comp/env/ejb/SkuTimerLocal";
| public static final String JNDI_NAME="SkuTimerLocal";
|
| public com.mpobjects.ime.core.ejb.SkuTimerLocal create()
| throws javax.ejb.CreateException;
|
| }
|
The exception stacktrace (from server.log file):
| 2004-03-30 16:36:28,775 DEBUG [javax.management.timer.Timer] new
RegisteredNotification: [timer=jboss:service=Timer,id=1,startDate=Tue Mar 30 16:36:38
CEST 2004,periode=0,occurences=1,nextDate=Tue Mar 30 16:36:38 CEST 2004]
| 2004-03-30 16:36:28,785 DEBUG
[org.jboss.varia.scheduler.ScheduleManager$ScheduleInstance] start(), add Notification
to Timer with ID: 1
| 2004-03-30 16:36:28,785 DEBUG [org.jboss.ejb.timer.SchedulerTimerSource] Call
add() on : jboss:service=TimePersistenceManager,type=File, container id:
jboss.j2ee:jndiName=SkuTimerBean,service=EJB, id: 0
| 2004-03-30 16:36:28,795 INFO [org.jboss.ejb.timer.FilePersistenceManager] Create
Output file: 0, for container: jboss.j2ee:jndiName=SkuTimerBean,service=EJB
| 2004-03-30 16:36:28,795 DEBUG [org.jboss.ejb.timer.FilePersistenceManager] Write
Timer Item to output file: FilePersistenceManager.TimerItem [ , type: ADD, timer rep:
ContainerTimerRepresentative [ Id: 0, key: null, start date: Tue Mar 30 16:36:38 CEST
2004, interval: single timer, info: Created the timer ] ]
| 2004-03-30 16:36:38,770 DEBUG [javax.management.timer.Timer] sendNotification:
RegisteredNotification: [timer=jboss:service=Timer,id=1,startDate=Tue Mar 30 16:36:38
CEST 2004,periode=0,occurences=1,nextDate=Tue Mar 30 16:36:38 CEST 2004]
| 2004-03-30 16:36:38,770 DEBUG
[org.jboss.varia.scheduler.ScheduleManager$MBeanListener]
MBeanListener.handleNotification(), notification:
javax.management.timer.TimerNotification: type=Schedule source=jboss:service=Timer
sequence=1 time=1080657398765 message=Scheduler Notification id=1 userData=0
| 2004-03-30 16:36:38,770 DEBUG
[org.jboss.varia.scheduler.ScheduleManager$MBeanListener] Scheduler is started: true
| 2004-03-30 16:36:38,770 DEBUG
[org.jboss.varia.scheduler.ScheduleManager$MBeanListener] MBean Arguments are: [0, Tue
Mar 30 16:36:38 CEST 2004]
| 2004-03-30 16:36:38,770 DEBUG
[org.jboss.varia.scheduler.ScheduleManager$MBeanListener] MBean Arguments Types are:
[java.lang.Integer, java.util.Date]
| 2004-03-30 16:36:38,770 DEBUG
[org.jboss.varia.scheduler.ScheduleManager$MBeanListener]
invoke(jboss:service=EJBTimerService, handleTimedEvent
| 2004-03-30 16:36:38,770 DEBUG [org.jboss.ejb.timer.ContainerTimerService]
handleTimedEvent(), this: [EMAIL PROTECTED], call timer: [EMAIL PROTECTED], container:
[EMAIL PROTECTED]
| 2004-03-30 16:36:38,770 INFO [STDOUT] SkuTimerBean.ejbTimeout called
| 2004-03-30 16:36:38,770 DEBUG [org.jboss.ejb.timer.ContainerTimerService]
cancel(), cancel timer: 0
| 2004-03-30 16:36:38,770 DEBUG [org.jboss.ejb.timer.SchedulerTimerSource] Remove
timer: 0, of container: jboss.j2ee:jndiName=SkuTimerBean,service=EJB
| 2004-03-30 16:36:38,770 DEBUG [org.jboss.ejb.timer.FilePersistenceManager]
remove(), container: jboss.j2ee:jndiName=SkuTimerBean,service=EJB, id: 0, timer list:
{0=FilePersistenceManager.TimerItem [ , type: ADD, timer rep:
ContainerTimerRepresentative [ Id: 0, key: null, start date: Tue Mar 30 16:36:38 CEST
2004, interval:
| single timer, info: Created the timer ] ],
4=FilePersistenceManager.TimerItem [ , type: ADD, timer rep:
ContainerTimerRepresentative [ Id: 4, key: [EMAIL PROTECTED], start date: Tue Mar 30
16:19:29 CEST 2004, interval: single timer, info: [EMAIL PROTECTED] ] ],
5=FilePersistenceManager.TimerItem [ , type: ADD, timer rep:
ContainerTimerRepresentative
| [ Id: 5, key: [EMAIL PROTECTED], start date: Tue Mar 30 16:19:29 CEST
2004, interval: single timer, info: [EMAIL PROTECTED] ] ],
6=FilePersistenceManager.TimerItem [ , type: ADD, timer rep:
ContainerTimerRepresentative [ Id: 6, key: [EMAIL PROTECTED], start date: Tue Mar 30
16:26:04 CEST 2004, interval: single timer, info: [EMAIL PROTECTED] ] ],
7=FilePersistenceManager.TimerItem
| [ , type: ADD, timer rep: ContainerTimerRepresentative [ Id: 7, key:
[EMAIL PROTECTED], start date: Tue Mar 30 16:26:04 CEST 2004, interval: single timer,
info: [EMAIL PROTECTED] ] ], 8=FilePersistenceManager.TimerItem [ , type: ADD, timer
rep: ContainerTimerRepresentative [ Id: 8, key: [EMAIL PROTECTED], start date: Tue Mar
30 16:31:20 CEST 2004, interval: single timer,
| info: [EMAIL PROTECTED] ] ], 9=FilePersistenceManager.TimerItem [ , type:
ADD, timer rep: ContainerTimerRepresentative [ Id: 9, key: [EMAIL PROTECTED], start
date: Tue Mar 30 16:33:29 CEST 2004, interval: single timer, info: [EMAIL PROTECTED] ]
]}, output: [EMAIL PROTECTED]
| 2004-03-30 16:36:38,780 INFO [org.jboss.ejb.timer.FilePersistenceManager] Write
remove timer to file: FilePersistenceManager.TimerItem [ , type: REMOVE, timer rep:
null ]
| 2004-03-30 16:36:38,850 DEBUG
[org.jboss.varia.scheduler.ScheduleManager$ScheduleInstance] stopSchedule(),
notification id: 1
| 2004-03-30 16:36:38,850 DEBUG [javax.management.timer.Timer] removeNotification:
jboss:service=Timer,id=1
| 2004-03-30 16:36:38,850 DEBUG
[org.jboss.varia.scheduler.ScheduleManager$MBeanListener] Remaining Repititions: 0,
wait for next call to stop: false
| 2004-03-30 16:36:38,850 DEBUG
[org.jboss.varia.scheduler.ScheduleManager$ScheduleInstance] stopSchedule(),
notification id: 1
| 2004-03-30 16:36:38,850 ERROR
[org.jboss.varia.scheduler.ScheduleManager$MBeanListener] Handling a Scheduler call
failed
| javax.management.ListenerNotFoundException: Listener not found [EMAIL PROTECTED]
for object name jboss:service=Timer
| at
org.jboss.mx.notification.MBeanServerListenerRegistry.remove(MBeanServerListenerRegistry.java:139)
| at
org.jboss.mx.server.MBeanServerImpl.removeNotificationListener(MBeanServerImpl.java:603)
| at
org.jboss.varia.scheduler.ScheduleManager$ScheduleInstance.stop(ScheduleManager.java:835)
| at
org.jboss.varia.scheduler.ScheduleManager$MBeanListener.handleNotification(ScheduleManager.java:612)
| at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
| at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
| at java.lang.reflect.Method.invoke(Method.java:324)
| at
org.jboss.mx.notification.NotificationListenerProxy.invoke(NotificationListenerProxy.java:138)
| at $Proxy9.handleNotification(Unknown Source)
| at
javax.management.NotificationBroadcasterSupport.handleNotification(NotificationBroadcasterSupport.java:98)
| at
javax.management.NotificationBroadcasterSupport.sendNotification(NotificationBroadcasterSupport.java:83)
| at javax.management.timer.Timer.sendNotifications(Timer.java:496)
| at javax.management.timer.Timer.access$100(Timer.java:32)
| at javax.management.timer.Timer$RegisteredNotification.doRun(Timer.java:666)
| at org.jboss.mx.util.SchedulableRunnable.run(SchedulableRunnable.java:175)
| at org.jboss.mx.util.ThreadPool$Worker.run(ThreadPool.java:238)
| 2004-03-30 16:36:38,850 DEBUG [javax.management.timer.Timer] remove:
RegisteredNotification: [timer=jboss:service=Timer,id=1,startDate=Tue Mar 30 16:36:38
CEST 2004,periode=0,occurences=1,nextDate=Thu Jan 01 01:00:00 CET 1970]
| 2004-03-30 16:43:37,253 DEBUG [org.jboss.resource.connectionmanager.IdleRemover]
run: IdleRemover notifying pools, interval: 450000
|
View the original post :
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=3828121#3828121
Reply to the post :
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=3828121
-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
JBoss-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-user