2011-04-12 85 views
1

比方说,我有一个CronExpression领域的一些DB实体:调度的持久性实体

@Entity 
@Table(name = "job") 
public class Job { 
    ... 
    private CronExpression cronExpression; 

} 

什么是将它放入石英表的最佳方法?我使用Spring3和Hibernate。基本上我可以安排在我的DAO - 任何时候创建或更新作业 - 但我也需要安排应用程序启动时的所有存在的工作..

感谢您的建议!

+0

你真的想安排实体吗?在石英中,如果你想要的话,你可以安排一个任务并加载实体,或者如果你想重用实例,那么可以将它缓存在某个地方..这不够吗?我无法弄清楚需求..你能解释更多吗? – Premraj 2011-04-12 09:00:34

+0

我实际上需要执行一些方法(以Job实体表示的方式),这将会知道一个Job ID - 这足够了 – 2011-04-12 09:07:16

+0

您能否告诉我它的业务需求,以便您必须这样实现? – 2011-04-12 11:45:53

回答

1

您需要DAO/Repository才能从您的存储中获取所有cronExpression。我在内存中创建DAO

@Repository 
public class JobEntityDao { 
    public List<JobEntity> findAll() { 
     List<JobEntity> list = new ArrayList<JobEntity>(); 

     JobEntity job1 = new JobEntity("0 0 12 * * ?"); 
     JobEntity job2 = new JobEntity("0 15 10 ? * *"); 
     JobEntity job3 = new JobEntity("0 15 10 * * ?"); 

     list.add(job1); 
     list.add(job2); 
     list.add(job3); 

     return list; 
    } 
} 

和组件创建基于您的cronExpression石英调度程序。我把它叫做QuartzExecutor

@Service 
public class QuartzExecutor { 


    private JobEntityDao jobEntityDao; 

    @Autowired 
    public QuartzExecutor(JobEntityDao jobEntityDao) throws ParseException, SchedulerException { 
     this.jobEntityDao = jobEntityDao; 
     init(); 
    } 

    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    private void init() throws ParseException, SchedulerException { 
     List<JobEntity> jobEntities = jobEntityDao.findAll(); 

     for (JobEntity jobEntity : jobEntities) { 
      System.out.println(jobEntity.cronExpression); 

      RunMeTask task = new RunMeTask(); 

      //specify your sceduler task details 
      JobDetail job = new JobDetail(); 
      job.setName("runMeJob"); 
      job.setJobClass(RunMeJob.class); 

      Map dataMap = job.getJobDataMap(); 
      dataMap.put("runMeTask", task); 

      //configure the scheduler time 
      CronTrigger trigger = new CronTrigger(); 
      trigger.setName("runMeJobTesting"); 
      trigger.setCronExpression(jobEntity.cronExpression); 

      //schedule it 
      Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 
      scheduler.start(); 
      scheduler.scheduleJob(job, trigger); 
     } 
    } 

} 

你可以从http://www.mkyong.com/java/quartz-scheduler-example/得到RunMeJob and RunMeTask代码。 我知道班级设计不好,但我关心的是尝试解决你的问题。

这是你在找什么?

+0

谢谢!但是,如果JobEntity更改其cronExpression会怎样? – 2011-04-12 18:45:25

+0

您必须使调度程序列表为QuartzExecutor属性。并添加重启方法 当您更改实体时,您可以调用restart方法来调用init方法。 – 2011-04-13 08:18:22