2009-10-23 6 views
3

Je suis en train d'invoquer la méthode basée sur un certain intervalle de temps, voici quelques haricots à l'intérieur applicationContext.xmlproblème quartz printemps

<bean id="MngtTarget" 
    class="com.management.engine.Implementation" 
    abstract="false" lazy-init="true" autowire="default" dependency-check="default"> 

    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
     <property name="targetObject" ref="MngtTarget" /> 
     <property name="targetMethod" value="findItemByPIdEndDate"/> 
    </bean> 


    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 

     <property name="jobDetail" ref="jobDetail" /> 
     <!-- 10 seconds --> 
     <property name="startDelay" value="10000" /> 
     <!-- repeat every 50 seconds --> 
     <property name="repeatInterval" value="20000" /> 
    </bean> 


    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
     <property name="triggers"> 
      <list> 
       <ref bean="simpleTrigger" /> 
      </list> 
     </property> 
    </bean> 

Voici la méthode que je suis en train d'invoquer:

public List<Long> I need findItemByPIdEndDate() throws Exception { 

       List<Long> list = null; 

       try{ 
         Session session = sessionFactory.getCurrentSession(); 

         Query query = session.getNamedQuery("endDateChecker"); 
         list = query.list(); 

         for(int i=0; i<list.size(); i++) 
         { 
           System.out.println(list.get(i)); 
         } 

         System.out.println("Total " + list.size()); 

       }catch (HibernateException e){ 
         throw new DataAccessException(e.getMessage()); 
       } 

       return list; 
     } 

Voici le message d'exception que je reçois:

Invocation of method 'findItemByPIdEndDate' on target class [class com.management.engine.Implementation] failed; nested exception is No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 

J'ai passé du temps googler beaucoup jusqu'à présent j'ai aussi Trie d pour modifier ma méthode comme ceci:

public List<Long> I need findItemByPIdEndDate() throws Exception { 

        List<Long> list = null; 

        try{ 
          Session session = sessionFactory.openSession(); 

          Query query = session.getNamedQuery("endDateChecker"); 
          list = query.list(); 

          for(int i=0; i<list.size(); i++) 
          { 
            System.out.println(list.get(i)); 
          } 

          System.out.println("Total " + list.size()); 
          session.close(); 
        }catch (HibernateException e){ 
          throw new DataAccessException(e.getMessage()); 
        } 

        return list; 
      } 

Et je reçois différents msg d'erreur, je reçois: Invocation of method 'findItemByPIdEndDate' on target class [class com.management.engine.Implementation] failed; nested exception is could not execute query], tout le monde sait ce qui est tout cela au sujet, des suggestions? merci

Aussi mon queries.hbm.xml

<hibernate-mapping> 

<sql-query name="endDateChecker"> 
<return-scalar column="PId" type="java.lang.Long"/> 
     <![CDATA[select 
    item_pid as PId 
    from 
     item 
     where 
     end_date < trunc(sysdate)]]>  
</sql-query> 
</hibernate-mapping> 
+0

S'il vous plaît ajoutez votre configuration Hibernate – sfussenegger

+0

imprimer uniquement le * objet de requête * et voyez si vous obtenez la requête attendue ' 'endDateChecker'' –

+0

Je suis en train attendu requête – ant

Répondre

5

Pour la deuxième erreur (« ne pouvait pas exécuter la requête »), je ne sais pas et je me demande vraiment ce que la séance ressemble . En fait, AFAIK, le contexte persistant n'est pas disponible pour Quartz Jobs car rien ne s'occupe d'établir une Session Hibernate pour eux (Quartz fonctionne en dehors du contexte des Servlets et la session ouverte dans le modèle de vue ne s'applique pas ici) . C'est pourquoi vous obtenez la première erreur ("Pas de session d'hibernation liée au thread"). Une solution pour cela est décrite dans AOP – Spring – Hibernate Sessions for background threads/jobs. Dans ce post, l'auteur montre comment vous pouvez utiliser Spring AOP proxies pour câbler un intercepteur hibernate qui vous donne accès au contexte de persistance et il faut prendre soin de la fermeture et l'ouverture des sessions pour vous.

Je ne l'ai pas testé moi-même, mais cela devrait fonctionner.

+0

Merci m8, ce n'était pas la solution mais ça m'a conduit à un tel que ça se qualifie comme la bonne réponse. gr8 – ant

+0

Heureux que je pourrais aider. Cependant, pouvez-vous élaborer un peu le "ce n'était pas la solution" pour que je puisse mettre à jour cette réponse? Merci d'avance. –

3

Moi aussi, je faisais face à la même « HibernateException: pas de Session lié à fileter » exception

2012-01-13 13:16:15.005 DEBUG MyQuartzJob Caught an exception 
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 
at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63) 
at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687) 
at com.company.somemodule.dao.hibernate.AbstractHibernateDaoImpl.getSession(AbstractHibernateDaoImpl.java:107) 
at com.company.somemodule.dao.hibernate.SomeDataDaoImpl.retrieveSomeData(SomeDataDaoImpl.java:264) 

et je résolus en suivant l'exemple here.

Code pertinent

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.orm.hibernate3.SessionFactoryUtils; 
import org.springframework.orm.hibernate3.SessionHolder; 
import org.springframework.scheduling.quartz.QuartzJobBean; 
import org.springframework.transaction.support.TransactionSynchronizationManager; 

import com.company.somemodule.dao.SomeDataDao; 
import com.company.somemodule.SomeData; 

public class MyQuartzJob extends QuartzJobBean implements Runnable { 

    private boolean existingTransaction; 
    private JobExecutionContext jobExecCtx; 
    private static Logger logger = LoggerFactory.getLogger(MyQuartzJob.class); 
    private SomeDataDao someDataDao; //set by Spring 
    private Session session; 
    private SessionFactory hibernateSessionFactory; //set by Spring 

    protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException 
    this.jobExecCtx = ctx; 
    run(); 
    } 

    private void handleHibernateTransactionIntricacies() { 
    session = SessionFactoryUtils.getSession(hibernateSessionFactory, true); 
    existingTransaction = SessionFactoryUtils.isSessionTransactional(session, hibernateSessionFactory); 
    if (existingTransaction) { 
     logger.debug("Found thread-bound Session for Quartz job"); 
    } else { 
     TransactionSynchronizationManager.bindResource(hibernateSessionFactory, new SessionHolder(session)); 
    } 
    } 


    private void releaseHibernateSessionConditionally() { 
    if (existingTransaction) { 
     logger.debug("Not closing pre-bound Hibernate Session after TransactionalQuartzTask"); 
    } else { 
     TransactionSynchronizationManager.unbindResource(hibernateSessionFactory); 
     SessionFactoryUtils.releaseSession(session, hibernateSessionFactory); 
    } 
    } 

    @Override 
    public void run() { 
    // .. 

    // Do the required to avoid HibernateException: No Hibernate Session bound to thread 
    handleHibernateTransactionIntricacies(); 

    // Do the transactional operations 
    try { 

     // Do DAO related operations .. 

    } finally { 
     releaseHibernateSessionConditionally(); 
    } 
    } 

    public void setHibernateSessionFactory(SessionFactory hibernateSessionFactory) { 
    this.hibernateSessionFactory = hibernateSessionFactory; 
    } 

    public void setSomeDataDao(SomeDataDao someDataDao) { 
    this.someDataDao = someDataDao ; 
    } 
} 

configuration de haricot pertinente dans applicationContext.xml

<bean name="myJob" class="org.springframework.scheduling.quartz.JobDetailBean"> 
    <property name="jobClass" value="com.somecompany.worker.MyQuartzJob" /> 
    <property name="jobDataAsMap"> 
    <map> 
     <entry key="hibernateSessionFactory" value-ref="sessionFactory" /> 
     <entry key="someDataDao" value-ref="someDataDao" /> 
    </map> 
    </property> 
</bean> 
+0

Vous avez sauvé ma journée !!! – Reusable