Injection of bean in Timer
jcarlos_andia Feb 11, 2008 3:15 PMHi.
I have an Action handler associated to the event NODE_ENTER of a state. The first time it executes (when the token enters the node) a timer is created. The next "n" times (which is fired by the timer and not by the event) the method tries to look for a Stateful session bean in context. This is the code:
public class MyActionHandler implements ActionHandler{ private static final long serialVersionUID = -7574831777028763706L; public void execute(ExecutionContext context) throws Exception{ if(context.getTimer()==null){ System.out.println("ADDING TIMER ..."); Calendar cal=Calendar.getInstance(); BusinessCalendar bc=new BusinessCalendar(); Duration duration=new Duration("20 seconds"); Date dueDate=bc.add(cal.getTime(), duration); Timer myTimer=new Timer(); myTimer.setName("[TIMER] "+context.getEventSource().getName()); myTimer.setDueDate(dueDate); myTimer.setRepeat("20 seconds"); myTimer.setRetries(3); myTimer.setAction(context.getAction()); context.setTimer(myTimer); context.getJbpmContext().getServices().getSchedulerService().createTimer(myTimer); }else{ System.out.println("EXECUTING ..."); System.out.println("CommonUtil="+Component.getInstance("commonUtil")); } }
It fails when it tries to retrieve the bean from the context. The log:
14:43:25,612 INFO [STDOUT] EXECUTING ... 14:43:25,618 WARN [Timer] timer action threw exception java.lang.IllegalStateException: No application context active at org.jboss.seam.Component.forName(Component.java:1799) at org.jboss.seam.Component.getInstance(Component.java:1849) at org.jboss.seam.Component.getInstance(Component.java:1832) at org.jboss.seam.Component.getInstance(Component.java:1826) at com.jotatech.vgrc.action.visual.MyActionHandler.execute(MyActionHandler.java:43) at org.jbpm.graph.def.Action.execute(Action.java:122) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173) at org.jbpm.graph.def.Action_$$_javassist_316.execute(Action_$$_javassist_316.java) at org.jbpm.job.Timer.execute(Timer.java:58) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173) at org.jbpm.job.Job_$$_javassist_307.execute(Job_$$_javassist_307.java) at org.jbpm.job.executor.JobExecutorThread.executeJob(JobExecutorThread.java:161) at org.jbpm.job.executor.JobExecutorThread.run(JobExecutorThread.java:62)
It seems that when the timer if fired it doesn't "look" in the context where all beans are. Any idea of how can I solve this?. Or a way to inject seam components within a timer context? Thanks in advance.