[RESOLVIDO] Spring Context + Quartz + Websphere

Estou definindo a arquitetura comum de agendamento de tarefas no meu projeto.
Estou utilizando Websphere 6.1.0.27; Spring 2.5.6 e Quartz 1.6.6.
E pra isso está faltando eu conseguir obter o contexto do spring na execução de um Job Quartz.

Estou seguindo esta implementação:
http://cse-mjmcl.cse.bris.ac.uk/blog/2007/06/20/1182370280435.html

Com o applicationContext; logo que subí a aplicação já caiu no meu Job; porem não conseguiu capturar o contexto onde faz “schedulerContext.get(APPLICATION_CONTEXT_KEY)”; assim como no exemplo.
E deu esse erro:[quote][02/02/10 13:03:43:062 ACT] 0000036b SystemOut O 13:03:43.062 [schedulerBean_Worker-1] ERROR c.a.b.app.gac.service.impl.JobTeste - org.quartz.JobExecutionException: No application context available in scheduler context for key “applicationContext”[/quote]A variável está declarada com o valor “applicationContex” mesmo e no applicationContext.xml tambem está assim.
Meu applicationContext.xml está no final do tópico.

Enfim; isto não é o que mais estou preocupado agora.
Pois estou tendo problemas para refazer este cenário acontecer de novo.

[size=17]O que acontece é o seguinte: quando este primeiro problema aconteceu; eu estava sem o debug ligado. Então para tentar solução para este problema; iniciei o debug e fui reiniciar a aplicação no servidor ( pra rodar novamente os agendamentos pois meu repeatCount estava com o valor = 3; significando que o Job rodou 3 vezes no primeiro teste e parou ). Até aqui tudo bem. Então com o reinício da aplicação eu estava esperando que este Job fosse dar o mesmo problema; porem agora eu estava com o debug ativo para análise. Mas aí que o pior aconteceu: o servidor reiniciou e nada do quartz “aconteceu”. Isto é completamente inesperado pois não modifiquei nada no applicationContext.xml ou qquer que seja o arquivo. Somente reiniciei o servidor ! E agora ? O que devo fazer ?[/size]
Já desinstalei a aplicação do websphere; limpei os arquivos temporarios do websphere; instalei a aplicação de novo; desliguei o debug … e nada !

A única coisa é que notei algo suspeito no log; que nao havia aparecido quando subí o servidor e o Job funcionou:

[quote][03/02/10 13:15:35:484 ACT] 00000025 VirtualHost I SRVE0250I: O Módulo da Web GAC foi ligado ao default_host[:9080,:80,:9443,:5060,:5061,:443].
[03/02/10 13:15:35:515 ACT] 00000025 ApplicationMg A WSVR0221I: Aplicativo iniciado: GAC
[03/02/10 13:16:06:828 ACT] 00000025 AppBinaryProc I ADMA7021I: A distribuição do aplicativo GAC foi concluída com êxito.
[03/02/10 13:16:06:843 ACT] 00000025 FileRepositor A ADMR0015I: O usuário defaultWIMFileBasedRealm/wasadmin criou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deltas/GAC/delta-1265220780781.
[03/02/10 13:16:06:843 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deployments/GAC/gac.war/WEB-INF/.faces-config.xml.jsfdia.
[03/02/10 13:16:06:859 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deployments/GAC/META-INF/ibm-application-bnd.xmi.
[03/02/10 13:16:06:859 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deployments/GAC/gac.war/WEB-INF/web.xml.
[03/02/10 13:16:07:015 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deployments/GAC/gac.war/META-INF/MANIFEST.MF.
[03/02/10 13:16:07:015 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deployments/GAC/META-INF/MANIFEST.MF.
[03/02/10 13:16:07:046 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deployments/GAC/gac.war/WEB-INF/faces-config.xml.
[03/02/10 13:16:07:046 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deployments/GAC/gac.war/WEB-INF/.faces-navigation.xml.jsfdia.
[03/02/10 13:16:07:125 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deployments/GAC/gac.war/WEB-INF/applicationContext.xml.
[03/02/10 13:16:07:125 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deployments/GAC/deployment.xml.
[03/02/10 13:16:07:140 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deployments/GAC/gac.war/WEB-INF/ibm-web-ext.xmi.
[03/02/10 13:16:07:140 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/nodes/O360UDI17Node01/serverindex.xml.
[03/02/10 13:16:07:171 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deployments/GAC/gac.war/WEB-INF/faces-navigation.xml.
[03/02/10 13:16:07:187 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deployments/GAC/gac.war/WEB-INF/ibm-web-bnd.xmi.
[03/02/10 13:16:07:187 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deployments/GAC/META-INF/application.xml.
[03/02/10 13:16:07:187 ACT] 00000025 FileRepositor A ADMR0016I: O usuário defaultWIMFileBasedRealm/wasadmin modificou o documento cells/O360UDI17Node01Cell/applications/GAC.ear/GAC.ear.
[03/02/10 13:16:07:234 ACT] 00000025 FileRepositor A ADMR0017I: O usuário defaultWIMFileBasedRealm/wasadmin excluiu o documento cells/O360UDI17Node01Cell/applications/GAC.ear/deltas/GAC/delta-1265219703734.
[03/02/10 13:16:07:515 ACT] 00000028 ApplicationDe I ApplicationDeploymentController perform ApplicationDeploymentController: performing appcontexts refresh[/quote]

O log da hora que “funcionou” é esse (note que coloquei o início e o fim a partir de um log comum entre os dois):

[quote][02/02/10 13:00:29:718 ACT] 00000028 VirtualHost I SRVE0250I: O Módulo da Web GAC foi ligado ao default_host[:9080,:80,:9443,:5060,:5061,:443].
[02/02/10 13:00:29:718 ACT] 00000028 ApplicationMg I WSVR0226I: Pedido do módulo start operation iniciado pelo usuário concluído em Módulo, gac.war, do aplicativo, GAC
[02/02/10 13:02:33:140 ACT] 0000001f SystemOut O 13:02:33.140 [WebContainer : 2] INFO c.i.f.w.h.core.AsyncServerDetector - Asynchronous HTTP Service available: false
[02/02/10 13:02:33:140 ACT] 0000004c AsyncServerDe I gac: Asynchronous HTTP Service available: false
[02/02/10 13:02:33:343 ACT] 0000001f SystemOut O 13:02:33.343 [WebContainer : 2] INFO c.i.f.w.h.core.AsyncServerDetector - JMS API available: true
[02/02/10 13:02:33:343 ACT] 0000004c AsyncServerDe I gac: JMS API available: true
[02/02/10 13:02:33:625 ACT] 0000001f SystemOut O 13:02:33.625 [WebContainer : 2] INFO c.i.f.w.h.core.AsyncServerDetector - Adapting to Send Updated Views environment.
[02/02/10 13:02:33:625 ACT] 0000004c AsyncServerDe I gac: Adapting to Send Updated Views environment.
[02/02/10 13:03:11:156 ACT] 0000001f SystemOut O 13:03:11.156 [WebContainer : 2] DEBUG c.a.b.a.g.s.i.JobStarterServiceImpl - >> iniciarJobTeste()
[02/02/10 13:03:17:796 ACT] 0000001f SystemOut O 13:03:17.796 [WebContainer : 2] INFO org.quartz.core.QuartzScheduler - Scheduler schedulerBean_$NON_CLUSTERED started.
[02/02/10 13:03:17:843 ACT] 0000036b SystemOut O 13:03:17.843 [schedulerBean_Worker-1] DEBUG c.a.b.app.gac.service.impl.JobTeste - In JobTeste - executing its JOB at Tue Feb 02 13:03:17 ACT 2010 by triggerBean
[02/02/10 13:03:17:796 ACT] 0000004c QuartzSchedul I gac: Scheduler schedulerBean
$_NON_CLUSTERED started.
[02/02/10 13:03:18:125 ACT] 0000001f SystemOut O 13:03:18.125 [WebContainer : 2] INFO org.hibernate.util.NamingHelper - JNDI InitialContext properties:{}
[02/02/10 13:03:18:234 ACT] 0000036b SystemOut O 13:03:18.234 [schedulerBean_Worker-1] DEBUG c.a.b.app.gac.service.impl.JobTeste - getApplicationContext iniciado
[02/02/10 13:03:18:125 ACT] 0000004c NamingHelper I gac: JNDI InitialContext properties:{}
[02/02/10 13:03:18:500 ACT] 0000001f SystemOut O 13:03:18.500 [WebContainer : 2] DEBUG c.a.b.a.g.s.i.JobStarterServiceImpl - – iniciarJobTeste: Hits=1.0, LastValue=7141.0, Min=7141.0, Max=7141.0, Avg=7141.0, Total=7141.0, StdDev=0.0, FirstAccess=Tue Feb 02 13:03:18 ACT 2010, LastAccess=Tue Feb 02 13:03:18 ACT 2010
[02/02/10 13:03:18:875 ACT] 0000001f SystemOut O 13:03:18.875 [WebContainer : 2] DEBUG c.a.b.a.g.s.i.JobStarterServiceImpl - << iniciarJobTeste -> void
[02/02/10 13:03:27:796 ACT] 0000036c SystemOut O 13:03:27.796 [schedulerBean_Worker-2] DEBUG c.a.b.app.gac.service.impl.JobTeste - In JobTeste - executing its JOB at Tue Feb 02 13:03:27 ACT 2010 by triggerBean
[02/02/10 13:03:28:000 ACT] 0000036c SystemOut O 13:03:28.000 [schedulerBean_Worker-2] DEBUG c.a.b.app.gac.service.impl.JobTeste - getApplicationContext iniciado
[02/02/10 13:03:37:796 ACT] 0000036d SystemOut O 13:03:37.796 [schedulerBean_Worker-3] DEBUG c.a.b.app.gac.service.impl.JobTeste - In JobTeste - executing its JOB at Tue Feb 02 13:03:37 ACT 2010 by triggerBean
[02/02/10 13:03:38:000 ACT] 0000036d SystemOut O 13:03:38.000 [schedulerBean_Worker-3] DEBUG c.a.b.app.gac.service.impl.JobTeste - getApplicationContext iniciado
[02/02/10 13:03:43:062 ACT] 0000036b SystemOut O 13:03:43.062 [schedulerBean_Worker-1] ERROR c.a.b.app.gac.service.impl.JobTeste - org.quartz.JobExecutionException: No application context available in scheduler context for key “applicationContext”
at com.altec.bsbr.app.gac.service.impl.JobTeste.getApplicationContext(JobTeste.java:84)
at com.altec.bsbr.app.gac.service.impl.JobTeste.execute(JobTeste.java:54)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:534)

[02/02/10 13:03:43:062 ACT] 00000516 JobTeste E gac: org.quartz.JobExecutionException: No application context available in scheduler context for key “applicationContext”
at com.altec.bsbr.app.gac.service.impl.JobTeste.getApplicationContext(JobTeste.java:84)
at com.altec.bsbr.app.gac.service.impl.JobTeste.execute(JobTeste.java:54)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:534)

[02/02/10 13:03:44:828 ACT] 0000036c SystemOut O 13:03:44.828 [schedulerBean_Worker-2] ERROR c.a.b.app.gac.service.impl.JobTeste - org.quartz.JobExecutionException: No application context available in scheduler context for key “applicationContext”
at com.altec.bsbr.app.gac.service.impl.JobTeste.getApplicationContext(JobTeste.java:84)
at com.altec.bsbr.app.gac.service.impl.JobTeste.execute(JobTeste.java:54)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:534)

[02/02/10 13:03:44:828 ACT] 00000517 JobTeste E gac: org.quartz.JobExecutionException: No application context available in scheduler context for key “applicationContext”
at com.altec.bsbr.app.gac.service.impl.JobTeste.getApplicationContext(JobTeste.java:84)
at com.altec.bsbr.app.gac.service.impl.JobTeste.execute(JobTeste.java:54)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:534)

[02/02/10 13:03:45:218 ACT] 0000036d SystemOut O 13:03:45.218 [schedulerBean_Worker-3] ERROR c.a.b.app.gac.service.impl.JobTeste - org.quartz.JobExecutionException: No application context available in scheduler context for key “applicationContext”
at com.altec.bsbr.app.gac.service.impl.JobTeste.getApplicationContext(JobTeste.java:84)
at com.altec.bsbr.app.gac.service.impl.JobTeste.execute(JobTeste.java:54)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:534)

[02/02/10 13:03:45:218 ACT] 00000518 JobTeste E gac: org.quartz.JobExecutionException: No application context available in scheduler context for key “applicationContext”
at com.altec.bsbr.app.gac.service.impl.JobTeste.getApplicationContext(JobTeste.java:84)
at com.altec.bsbr.app.gac.service.impl.JobTeste.execute(JobTeste.java:54)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:534)

[02/02/10 13:33:47:312 ACT] 00000025 LTPAServerObj W SECJ0371W: Ocorreu uma falha na validação do token LTPA pois o token expirou, com as seguintes informações: Token expiration Date: Tue Feb 02 13:27:54 ACT 2010, current Date: Tue Feb 02 13:33:47 ACT 2010.
[02/02/10 13:33:47:328 ACT] 00000025 LTPAServerObj W SECJ0371W: Ocorreu uma falha na validação do token LTPA pois o token expirou, com as seguintes informações: Token expiration Date: Tue Feb 02 13:27:54 ACT 2010, current Date: Tue Feb 02 13:33:47 ACT 2010.
[02/02/10 13:34:28:875 ACT] 0000004e ApplicationDe I ApplicationDeploymentController perform ApplicationDeploymentController: performing appcontexts refresh[/quote]

.
applicationContext.xml:[code]<?xml version="1.0" encoding="UTF-8"?>


<!-- Define the Job Bean that will be executed. Our bean is named in the jobClass property. 
 -->
<bean name="myJob" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="com.altec.bsbr.app.gac.service.impl.JobTeste"/>
    <property name="name" value="JobTeste"/>
</bean>


<!-- Associate the Job Bean with a Trigger. Triggers define when a job is executed.
--> 
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
	<property name="jobDetail" ref="myJob"/>
	<property name="jobName" value="JobTeste" />
	<property name="startDelay" value="5000" />
	<property name="repeatInterval" value="10000" />
	<property name="repeatCount" value="3" />
</bean>


<!-- 
 -->
<bean name="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	<property name="triggers">
		<list>
			<ref bean="simpleTrigger" />
		</list>
	</property>
	<property name="applicationContextSchedulerContextKey">
		<value>applicationContext</value>
	</property>
</bean>
 <!--  applicationContextSchedulerContextKey: name used to publish applicationContext to Quartz Job instances
 , so they can call business services -->
[/code]

keywords: websphere “user defaultWIMFileBasedRealm” “modified document cells” spring context contexto quartz websphere was

Pessoal.

Não precisa ser solução pro problema acima.
Alguem já implementou quartz numa aplicação pra websphere; (com acesso ao banco)?

Não consegui resolver o problema acima; porem achei outra solução por enquanto.
Daqui a pouco edito esta resposta e coloco como fiz aqui.

Mas enquanto não tenho tempo queria saber se existe alguma classe pro QUARTZ igual as que se utiliza pra teste JUNIT que ajudam no ‘gerenciamento’ do contexto da aplicação ( AbstractSpringContextTests, AbstractSingleSpringContextTests, AbstractDependencyInjectionSpringContextTests, AbstractTransactionalSpringContextTests, AbstractTransactionalDataSourceSpringContextTests ).

Será que existe ?

Eu fiz algo assim:


        <bean name="sendMailJob" class="org.springframework.scheduling.quartz.JobDetailBean">
                <property name="jobClass" value="br.com.cbss.scheduler.mail.SendMailJob" />
                <property name="jobDataAsMap">
                        <map>
                                <entry key="springMail">
                                        <ref bean="springMail" />
                                </entry>
                                <entry key="daoFactory">
                                        <ref bean="daoFactory" />
                                </entry>
                        </map>
                </property>
        </bean>

o daoFactory é uma fabrica de daos normal.

a classe que envia os emails é assim:

public class SendMailJob extends QuartzJobBean {

	/**
	 * MailSender
	 */
	SpringMail springMail;
	
	/**
	 * Fabrica de daos
	 */
	DaoFactory daoFactory;

	/**
	 * Executa o envio dos emails
	 */
	@Override
	protected void executeInternal(JobExecutionContext arg0)
			throws JobExecutionException {
		List<Email> naoEnviados = daoFactory.getEmailDao().listEmailsNaoEnviados();
		
		for (Email email : naoEnviados) {
			springMail.send(email);
		}
	}

	public void setSpringMail(SpringMail springMail) {
		this.springMail = springMail;
	}

	public void setDaoFactory(DaoFactory daoFactory) {
		this.daoFactory = daoFactory;
	}


}

esses email são buscados no banco, (linha 19).

depois, esse serviço é agendado no quartz do spring mesmo.

Mario. No caso esse serviço já é o Job do quartz né ? É que você falou que “esse serviço é agendado no quartz do spring”.

Outra coisa. Qual o comportamento do daoFactory. Ele utiliza annotation ou busca os beans do xml ?

É que pelo xml eu consegui fazer.
Pra quem quiser já coloquei nesse tópico: http://www.guj.com.br/posts/list/136192.java

opa cara!

é, essa classe que eu te passe já é um job do quartz. ela estende QuartzJobBean, que é uma classe do Spring pra facilitar a integração. depois eu sócrio os triggers e agendo esse job no scheduler.

No caso dos daos, é tudo por annotation. segue o código (resumido) do emailDao e do daoFactory

[code]@Repository
public class EmailDao extends DaoImpl<Email, Long> {

public EmailDao() {
	super(Email.class);
}

@Resource(name = "sessionFactory")
public void setSessionFactory(SessionFactory sessionFactory) {
	super.setSessionFactory(sessionFactory);
}

@SuppressWarnings("unchecked")
public List<Email> listEmailsNaoEnviados() {
	DetachedCriteria criteria = DetachedCriteria.forClass(Email.class);
	criteria.add(Restrictions.eq("enviado", false));

	return hibernateTemplate.findByCriteria(criteria);

}

}[/code]

[code]@Service(“daoFactory”)
public class DaoFactory implements Serializable {

private static final long serialVersionUID = 8314041409599899982L;

// ...

@Autowired
private EmailDao emailDao;

public EmailDao getEmailDao() {
	return emailDao;
}

public void setEmailDao(EmailDao emailDao) {
	this.emailDao = emailDao;
}

}[/code]

[]'s

Hummm

Gostei. Vou tentar
Muito obrigado

Mario

Se você usa o HibernateDAOSupport ; como voce utilizou o método setSessionFactory no seu EmailDao; sendo que ele é final ?
“Cannot override the final method from HibernateDaoSupport”

segue o meu dao genérico.

[code]
/**

  • implementação genérica do DAO

  • @param Classe a ser persistida pelo dao

  • @param Classe que representa a chave
    */
    @SuppressWarnings(“serial”)
    public class DaoImpl<T, PK extends Serializable> implements Dao<T, PK> , Serializable{

    /**

    • Classe do objeto a ser persistido
      /
      protected Class classe;
      /
      *
    • HibernateTemplate do spring - implementa as operações básicas
      */
      protected HibernateTemplate hibernateTemplate;

    /**

    • Seta a sessionfactory utilizada por este dao
    • @param sessionFactory
      */
      public void setSessionFactory(SessionFactory sessionFactory){
      this.hibernateTemplate = new HibernateTemplate(sessionFactory);
      }

    /**

    • Construtor que recebe e inicia a classe
    • @param classe
      */
      public DaoImpl(Class classe) {
      this.classe = classe;
      }

    /**

    • grava o objeto na base
      */
      public T save(T u) {
      hibernateTemplate.saveOrUpdate(u);

      return u;
      }

    /**

    • grava uma coleção de objetos na base
      */
      public void save(Collection collection) {
      hibernateTemplate.saveOrUpdateAll(collection);
      }

    /**

    • Faz o merge de um objeto
      */
      public T merge(T u) {
      hibernateTemplate.merge(u);
      return u;
      }

    /**

    • remove um objeto da base
      */
      public T remove(T u) {
      hibernateTemplate.delete(u);
      return u;
      }

    /**

    • Remove todos os objetos da coleção da base
      */
      public void remove(Collection collection) {
      hibernateTemplate.deleteAll(collection);
      }

    @SuppressWarnings(“unchecked”)
    public List listAll() {
    return hibernateTemplate.loadAll(classe);
    }

    @SuppressWarnings(“unchecked”)
    public T findByPK(PK pk) {
    if (pk == null)
    return null;
    return (T) hibernateTemplate.get(this.classe, pk);
    }

    @SuppressWarnings(“unchecked”)
    public T findByQuery(String query) {
    return (T) hibernateTemplate.find(query).get(0);
    }

    @SuppressWarnings(“unchecked”)
    public T findByQuery(String query, Map<String, Object> params) {
    Query qry = hibernateTemplate.getSessionFactory().getCurrentSession()
    .createQuery(query);

     for (Entry<String, Object> entry : params.entrySet()) {
     	qry.setParameter(entry.getKey(), entry.getValue());
     }
    
     try {
     	return (T) qry.uniqueResult();
     } catch (NoResultException e) {
     	return null;
     }
    

    }

    public List listByQuery(String query) {
    return listByQuery(query, null, 0, 0);
    }

    public List listByQuery(String query, Map<String, Object> params) {
    return listByQuery(query, params, 0, 0);
    }

    @SuppressWarnings(“unchecked”)
    public List listByQuery(String query, Map<String, Object> params,
    int maximo, int atual) {
    Query qry = hibernateTemplate.getSessionFactory().getCurrentSession()
    .createQuery(query);

     if (params != null) {
     	for (Entry<String, Object> entry : params.entrySet()) {
     		qry.setParameter(entry.getKey(), entry.getValue());
     	}
     }
    
     if (atual >= 0 && maximo > 0) {
     	qry.setFirstResult(atual);
     	qry.setMaxResults(maximo);
     }
    
     return qry.list();
    

    }

    public void merge(Collection collection) {

     for (T t : collection) {
     	this.merge(t);
     }
    

    }
    }[/code]

eu faço tudo usando o hibernateTemplate.

[]'s

Caros,

Impressionantemente ainda estou com problemas para finalizar este procedimento.
Notem pelas figuras; que os beans são injetados enquanto debugo o método init.
Porem no execute do job quartz (que vem depois) os seus valores foram “resetados” (?) pra null !
O que pode ser isso ? Qual a causa ?

Devido à injeção já estar funcionando creio não ser necessário eu colocar meus códigos aqui de novo. Com o tempo vou disponibilizando-os aqui para facilitar possíveis ajudas; caso o problema ainda nao tenha sido resolvido.

[size=18][color=blue]PROBLEMAS RESOLVIDOS[/color][/size]

No meu teste eu tinha dois Jobs do Spring; um extendendo do comum org.quartz.Job e outro do org.springframework.scheduling.quartz.QuartzJobBean.

O erro acima estava acontecendo pq sem querer o xml que estava sendo testado era o que estava utilizando o Job comum; sendo que quando eu troquei pra utilizar o QuartzJobBean a injeção funcionou. :smiley:
Engraçado é que realmente teve que fazer a ponte com o serviço DaoFactory ; pois o dao direto não foi injetado !

Enfim. Só tenho à agradecer ao Mário e à todos que ajudaram. Muito obrigado.
Desculpem o incomodo