8

I've a web application which uses framework like Struts and Hibernate. Currently I'm developing a scheduler for this application using Quartz. While coding I realized that the use of Hibernate session is not possible with the threads of Quartz.

Anybody have a solution for using hibernate sessions from quartz job class?

Sastrija
  • 3,284
  • 6
  • 47
  • 64

4 Answers4

4

I know this is an old question, but I did a quick Google search, and this was the first hit.

In the quartz job, add this line at the start of the method:

public void execute(JobExecutionContext context) throws JobExecutionException
{
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); //<-- this line

     //...your code here...
}

I apologize if this doesn't fix your specific issue, but I suspect it will catch someone in the future.

user2529170
  • 71
  • 1
  • 8
  • Thanks a million for your answer. I was facing this problem from last few days and your answer solve my issues.... Thanks a million again – Luffy Nov 27 '15 at 05:25
4

One approach is to use a HibernateUtil class which builds the SessionFactory in a static initializer and makes it available via a public static getter. Your Quartz job can create a Session as HibernateUtil.getSessionFactory().getCurrentSession() and use it.

Binil Thomas
  • 13,699
  • 10
  • 57
  • 70
  • My quartz job class is supposed to FTP to some remote servers and upload a large collection(millions) XML files to them. Is this the right method to follow for this scenario? – Sastrija Dec 15 '10 at 06:02
  • My code is producing lots of errors while running the hibernate from a quartz job. If I run it from outside the quartz, it works correctly and do all DB operations. What I need to change to make it working with quartz. – Sastrija Dec 22 '10 at 04:18
2

Searching for "Quartz Hibernate" returned this. Coming to a different solution (and using Tapestry), I thought I'd share it.

when scheduling the Job:

…
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
JobDataMap myJobDataMap = new JobDataMap();
myJobDataMap.put("HibernateSessionManager", hibernateSessionManager);
        myJobDataMap.put("PerthreadManager", perThreadManager);
JobDetail job = JobBuilder.newJob(SomeJob.class).withIdentity(
            "SomeJob", "someGroup").setJobData(
            myJobDataMap).build();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(
            "Some Trigger", "someGroup").startNow().withSchedule(
            SimpleScheduleBuilder.repeatSecondlyForever(30)).build();
scheduler.scheduleJob(job, trigger);
scheduler.start();
…

and in the Job

public void execute(JobExecutionContext context)
                throws JobExecutionException
{
    JobDataMap jdm = context.getMergedJobDataMap();
    HibernateSessionManager hibernateSessionManager = (HibernateSessionManager) jdm.get("HibernateSessionManager");
    PerthreadManager perThreadManager = (PerthreadManager) jdm.get("PerthreadManager");

    Session session = hibernateSessionManager.getSession();
    //do stuff with session …
    //now clean up, otherwise I ended up with <IDLE> in transactions
    perThreadManager.cleanUp();
}

Hope somebody can use this.

1

You can look at the below link to see if it gives you a direction to follow. Since you are not using Spring, it might be hard to apply this directly

http://forum.springsource.org/showthread.php?t=12117

Fazal
  • 2,991
  • 7
  • 29
  • 37