Quartz2.2.1 개발 문제

6617 단어
1. org.springframework.scheduling.quartz.Method Invoking Job Detail Factory Bean 신문 java.io.NotSerializable Exception 예외로 QuartzJobBean을 실행해야 합니다.둘째, Dao는 서열화 인터페이스를 실현해야 한다. Hibernate dao는 Hibernate Dao Support에서 직접 계승할 수 없다. 왜냐하면 Hibernate Dao Support는 서열화 인터페이스를 실현하지 못했기 때문에Session Factory를 통해 Hibernate Template를 구축할 수 밖에 없다.3. 라이브러리에 Trigger가 존재하면 응용 프로그램이 시작될 때 라이브러리에서 존재하는 Trigger를 불러오고 자바에 보고합니다.io.InvalidObjectException: Could not find a SessionFactory named: null 등 SessionFactory 등과 관련된 예외입니다.시작할 때마다 받는SessionFactory 실례가 다르기 때문에 라이브러리에서 가져온 Job을 반서열화할 때 Job에 포함된 SessionFactory가 현재의 SessionFactory와 일치하지 않기 때문에null입니다
4.QuartzJobBean 클래스나 그 안의 속성이 수정되면 데이터베이스에 대응하는 qrtzjob_details 저장된jobclass_이전의QuartzJobBean입니다. 이 오래된 Job을 다시 실행할 때 해당하는QuartzJobBean을 찾을 수 없고, 빈 포인터가 이상합니다.
두 번째 문제와 세 번째는 서로 관련되어 있다. 이 두 문제를 해결하고자 하는 방안 중 하나는 Job에SessionFactory를 포함하지 않으면 모든 것이 OK되지 않는다는 것이다. 왜냐하면 SessionFactory는hibernate dao의 속성이고 hibernate dao는Simple Service의 속성이기 때문에 Simple Service에는hibernate dao 속성이 있을 수 없다.이렇게 Simple Service 업무 방법에 필요한hibernate dao는 어떻게 얻습니까?스프링에 대한 이해는 Application Context를 통해 모든spring bean을 얻을 수 있다는 것을 알지만, 여기서 Application Context는 어떻게 얻습니까?...org 보기.springframework.web.context.ContextLoaderListener org를 찾습니다.springframework.web.context.ContextLoader.GetCurrent Web Application Context () 는 Application Context를 얻을 수 있으며, Spring Bean 서비스 클래스를 추가하여 서열화된 인터페이스를 실현할 수 있으며, Spring Bean 서비스를 통해 웹에서 불러온spring bean을 얻을 수 있습니다.
package com.sundoctor.example.service;
import java.io.Serializable;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.web.context.ContextLoader;
@SuppressWarnings("unchecked")
@Service("springBeanService")
public class SpringBeanService implements Serializable{
 private static final long serialVersionUID = -2228376078979553838L;
 public <T> T getBean(Class<T> clazz,String beanName){
  ApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
  return (T)context.getBean(beanName);
 }
}

Hibernate Dao는 Job에 오래 지속되지 않기 때문에 서열화된 인터페이스를 실현할 필요가 없고 Hibernate Dao Support를 계승할 수 있다. 물론 계승하지 않을 수도 있고 자신의 취향에 따라 작성할 수도 있고 제한이 없다.
package com.sundoctor.example.dao;
import org.hibernate.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
import com.sundoctor.example.model.Customer;
import com.sundoctor.example.service.CustomerService;
@Repository("customerDao")
public class CustomerHibernateDao extends HibernateDaoSupport {
 private static final Logger logger = LoggerFactory.getLogger(CustomerService.class);
 public Customer getCustomer2() { 
  return (Customer) this.getHibernateTemplate().execute(new HibernateCallback() {
   public Object doInHibernate(Session session) {
    Customer customer = (Customer) session.createQuery("from Customer where id = 1").uniqueResult();
    logger.info("Customer2={}", customer);
    return customer;
   }
  });
 }
 public Customer getCustomer1() {  
  Customer customer = (Customer) this.getHibernateTemplate().get(Customer.class, 1);
  logger.info("Customer1={}", customer);
  return customer;
 }
}

hibernate dao가 더 이상 서열화 인터페이스를 실현하지 않고 Hibernate Dao Support에서 계승하기 때문에 더 이상 업무 클래스에 주입할 수 없습니다.업무 클래스에 위의 SpringBean 서비스를 주입하고 업무 방법에 필요한hibernate dao는 위의 SpringBean 서비스를 통과합니다.getBean 가져오기
package com.sundoctor.example.service;
import java.io.Serializable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import com.sundoctor.example.dao.CustomerHibernateDao;
import com.sundoctor.example.model.Customer;
@Service("customerService")
public class CustomerService implements Serializable {
 private static final long serialVersionUID = -6857596724821490041L;
 private static final Logger logger = LoggerFactory.getLogger(CustomerService.class);
 private SpringBeanService springBeanService;
 @Autowired
 public void setSpringBeanService(@Qualifier("springBeanService") SpringBeanService springBeanService) {
  this.springBeanService = springBeanService;
 }
 public void testMethod1() {
  //             
  CustomerHibernateDao customerDao =springBeanService.getBean(CustomerHibernateDao.class,"customerDao");
  Customer customer = customerDao.getCustomer1();
  logger.info("AAAA:{}", customer);
 }
 public void testMethod2() {
  //           
  CustomerHibernateDao customerDao =springBeanService.getBean(CustomerHibernateDao.class,"customerDao");
  Customer customer = customerDao.getCustomer2();
  logger.info("BBBB:{}", customer);
 }

customer Service는 우리 Job이 구체적으로 실행하는 클래스입니다. 테이블qrtz 로 서열화되기 때문에 서열화되어야 합니다.job_details의jobclass_이 필드에서springBean 서비스 속성도 서열화되어야 합니다. 여기서springbeanse 서비스를 쓰지 않고testMethod에서 응용 프로그램 Context를 직접 사용할 수 있습니다.getBean은 dao를 가져와서 업무 조작을 진행합니다.
만약 임무가 실행되는 시간에 서버down이 떨어지거나 다른 원인으로 인해 임무가 순조롭게 완성되지 않았다면 어떻게 자동으로 또는 수동으로 깨우쳐서 그가 순조롭게 수행하도록 해야 합니까?
//   Scheduler
Scheduler scheduler = ...;//(Scheduler)springContext.getBean("quartzScheduler");
//  trigger name trigger group  SimpleTrigger 
SimpleTrigger trigger = (SimpleTrigger)scheduler.getTrigger("52f071d3-eebb-4308-abeb-9ce8ec58aba4", "DEFAULT");
//    Trigger       
int timesTriggered = trigger.getTimesTriggered();
trigger.setTimesTriggered(timesTriggered > 0 ? timesTriggered -1 : 0);
//  ,          
//trigger.setStartTime(startTime);
//  ,          
//trigger.setNextFireTime(nextFireTime);
//  ,              
//  rescheduleJob    tirgger
scheduler.rescheduleJob(trigger.getName(), trigger.getGroup(), trigger);

좋은 웹페이지 즐겨찾기