2010-12-15 14 views
5

Tengo una aplicación web que usa frameworks como Struts e Hibernate. Actualmente estoy desarrollando un planificador para esta aplicación usando Quartz. Mientras codificaba me di cuenta de que el uso de la sesión de Hibernate no es posible con los hilos de Quartz.Uso de la sesión de Hibernate con cuarzo

¿Alguien tiene una solución para usar las sesiones de hibernación de la clase de trabajo de cuarzo?

Respuesta

3

Uno es usar un HibernateUtil class que se basa la SessionFactory en un inicializador estático y lo pone a disposición a través de un captador public static. Su trabajo de Quartz puede crear un Session como HibernateUtil.getSessionFactory().getCurrentSession() y usarlo.

+0

Se supone que mi clase de trabajo de cuarzo debe enviar FTP a algunos servidores remotos y cargarles una colección grande (millones) de archivos XML. ¿Es este el método correcto a seguir para este escenario? – Joe

+0

Mi código produce muchos errores al ejecutar la hibernación de un trabajo de cuarzo. Si lo ejecuto desde fuera del cuarzo, funciona correctamente y hago todas las operaciones DB. Lo que necesito cambiar para que funcione con cuarzo. – Joe

+0

¿Qué tipo de errores? –

1

Puede consultar el siguiente enlace para ver si le da una dirección a seguir. Puesto que no se está utilizando la primavera, que podría ser difícil de aplicar este enfoque directamente

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

+0

Puedo usar la primavera en este caso, ya que tengo muy poca cantidad de código en Struts. – Joe

3

Sé que esta es una vieja pregunta, pero hice una búsqueda rápida en Google, y este fue el primer golpe.

En el trabajo de cuarzo, agregue esta línea al inicio del método:

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

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

Me disculpo si esto no soluciona su problema específico, pero sospecho que va a atrapar a alguien en el futuro.

+0

Gracias un millón por su respuesta. Me enfrenté a este problema en los últimos días y tu respuesta resuelve mis problemas ... Gracias un millón de nuevo – Luffy

1

Buscando "Quartz Hibernate" devolvió esto. Viniendo a una solución diferente (y usando Tapestry), pensé que lo compartiría.

la hora de programar el trabajo:

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

y en el empleo

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

espero que alguien puede usar esto.

Cuestiones relacionadas