2010-12-15 55 views
5

我有一个使用Struts和Hibernate之类的框架的Web应用程序。目前,我正在使用Quartz开发此应用程序的调度程序。在编码时,我意识到使用Quartz的线程不可能使用Hibernate会话。在石英中使用Hibernate会话

任何人都有使用石英工作类的休眠会话的解决方案?

回答

3

一种方法是使用HibernateUtil class它建立在一个静态初始化的SessionFactory,使通过public static吸气可用它。你的Quartz作业可以创建一个Session作为HibernateUtil.getSessionFactory().getCurrentSession()并使用它。

+0

我的石英工作类应该FTP到一些远程服务器上并向他们上传一个大集合(百万个)XML文件。这是这种情况下正确的方法吗? – Joe 2010-12-15 06:02:59

+0

我的代码在石英工作中运行休眠时产生了很多错误。如果我从石英外部运行它,它可以正常工作并执行所有数据库操作。我需要改变以使其与石英一起工作。 – Joe 2010-12-22 04:18:37

+0

什么样的错误? – 2011-01-21 02:57:16

3

我知道这是一个老问题,但我做了一个快速的谷歌搜索,这是第一次。

在石英工作,在方法的开始加入这一行:

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

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

我道歉,如果这不能解决您的问题,但我怀疑它会引起某人的未来。

+0

非常感谢您的回答。我是从前几天面临这个问题,你的答案解决我的问题.... 再次感谢百万 – Luffy 2015-11-27 05:25:23

1

搜索“Quartz Hibernate”返回了这个。来到不同的解决方案(并使用Tapestry),我想我会分享它。

调度时的工作:

… 
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(); 
… 

,并在工作

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(); 
} 

希望有人可以用这个。