Hi, I need to write a service where jobs can be added and should executed after a given delay. After execution they are finished, so periodical execution is not required. I prefer to user the ScheduledExecutorService for this task.

The question is now, how do I use my @Inject objects in the thread? Just passing them is not working (hibernate session is invalid). I read some stuff like http://wiki.apache.org/tapestry/Tapestry5HowToRunTaskInThread but it does'nt help me because I don't invoke the thread myself, the scheduler is doing it. Also the other tapestry classes like the ParallelExecutor or PeriodicExecutor doesn't seem to fit.

Any suggestions?

@Scope(ScopeConstants.DEFAULT)
public class MyServiceImpl implements MyService {

    @Inject
    MyDAO myDAO;

private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(4);

    public void addJob(Job job, long executeDelay) {
         scheduler.schedule(new JobTask(job, myDAO), executeDelay);
    }

    public static class JobTask implements Runnable {
        // some class members
        public JobTask(MyDAO myDAO, Job job) {
            this.myDAO = myDAO;
            this.job = job;
        }

        @Override
        public void run() {
          // ...
          Object result = myDAO.getSomethingFromJob(job);
          // ...
        }
     }
}

Thanks, Matthias

Reply via email to