2010-12-15 8 views
5

Ich habe eine Webanwendung, die Framework wie Struts und Hibernate verwendet. Derzeit entwickle ich einen Scheduler für diese Anwendung mit Quartz. Beim Codieren wurde mir klar, dass die Verwendung der Hibernate-Sitzung mit den Threads von Quartz nicht möglich ist.Verwenden der Hibernate-Sitzung mit Quarz

Hat jemand eine Lösung für die Verwendung von Hibernate-Sitzungen aus der Quarz-Job-Klasse?

Antwort

3

Ein Ansatz anzuwenden ist eine HibernateUtil class zu verwenden, die die SessionFactory in einem statischen Initialisierer baut und macht sie über eine public static Getter zur Verfügung. Ihr Quartz Job kann ein Session als HibernateUtil.getSessionFactory().getCurrentSession() erstellen und verwenden.

+0

Meine Quarz-Job-Klasse soll FTP auf einige Remote-Server übertragen und eine große Sammlung (Millionen) von XML-Dateien auf sie hochladen. Ist das die richtige Methode für dieses Szenario? – Joe

+0

Mein Code erzeugt viele Fehler beim Ausführen des Ruhezustands von einem Quarzjob. Wenn ich es von außerhalb des Quarzes laufe, funktioniert es korrekt und macht alle DB Operationen. Was ich ändern muss, damit es mit Quarz funktioniert. – Joe

+0

Welche Art von Fehlern? –

1

Sie können unter dem folgenden Link sehen, ob es Ihnen eine Richtung gibt zu folgen. Da Sie nicht Frühling verwenden, kann es schwierig sein, diese direkt

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

+0

Ich kann Feder in diesem Fall verwenden, da ich sehr wenig Code in Struts habe. – Joe

3

Ich weiß, dies ist eine alte Frage, aber ich habe eine schnelle Google-Suche, und das war der erste Treffer.

Im Quarz Job, fügen Sie diese Zeile zu Beginn des Verfahrens:

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

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

Ich entschuldige mich, wenn dies Ihr spezifisches Problem nicht beheben, aber ich vermute, dass es jemanden in der Zukunft zu fangen.

+0

Vielen Dank für Ihre Antwort. Ich hatte dieses Problem von den letzten paar Tagen und Ihre Antwort lösen meine Probleme .... Nochmals eine Million – Luffy

1

Die Suche nach "Quartz Hibernate" ergab dies. Ich kam zu einer anderen Lösung (und benutzte Tapestry) und dachte, ich würde es teilen.

wenn die Planung der Arbeit:

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

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

Hoffnung jemand kann diese verwenden.