【问题标题】:Custom Object parameters within Jobs using Quartz-scheduler使用 Quartz-scheduler 的 Jobs 中的自定义对象参数
【发布时间】:2012-07-15 12:14:03
【问题描述】:

我正在测试 Quartz 以安排工作。但是该作业包含 3 个不可序列化的参数。

我在下面创建了一个示例应用程序,说明我是如何实现该功能的。有谁知道如何使用 Quartz 将自定义对象用作参数?

下面是安排工作的触发器,我已经评论了给我带来问题的区域。

public class Trigger {

public void run() throws Exception {

    SchedulerFactory sf = new StdSchedulerFactory();
    Scheduler sched = sf.getScheduler();
    Date startTime = DateBuilder.nextGivenSecondDate(null, 15);


    JobDetail job = newJob(SimpleJob.class)
            .withIdentity("job6", "group1")
            .build();

    SimpleTrigger trigger = newTrigger()
            .withIdentity("trigger6", "group1")
            .startAt(startTime)
            .withSchedule(simpleSchedule()
                    .withIntervalInSeconds(60)
                    .repeatForever())
            .build();

    Date ft = sched.scheduleJob(job, trigger);

    TestObject testObject = new TestObject();

    // This is the part giving trouble!
    job.getJobDataMap().put(SimpleJob.test,testObject);

    sched.start();
}

}

这是我要安排的工作。

public class SimpleJob implements Job {

public static final TestObject test = null;

public SimpleJob() {

}

public void execute(JobExecutionContext context) throws JobExecutionException {

    test.saySomething();
}

}

最后是 TestObject 类。

public class TestObject {

public TestObject() {

}

public void saySomething() {

    System.out.println("Test Object initialized");
}

}

请注意,我只是在寻找一种方法让 Quartz 允许将不可序列化的对象用作参数(请不要评论上面正在执行的实际任务或工作)

我也尝试过为 TestObject 实现 Serializable 接口,但没有任何乐趣。

任何帮助将不胜感激。 谢谢你。

【问题讨论】:

标签: java scheduled-tasks quartz-scheduler job-scheduling


【解决方案1】:

实现您自己的JobFactory。它将自定义底层作业注入您需要的任何属性。

class MyJobFactory extends SimpleJobFactory {
    @Override
    public Job newJob(TriggerFiredBundle bundle, Scheduler Scheduler) throws SchedulerException {
        SimpleJob job = (SimpleJob) super.newJob(bundle, Scheduler);
        job.setTestObject(testObject);
        return job;
    }
}

您仍然需要使用 JobDetails 来通知您的作业的类,并且您需要修改调度程序以使用您的工厂。

Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.setJobFactory(new MyJobFactory());
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();

【讨论】:

  • 您的解决方案让我们深入了解 Quartz API。默认情况下,Quartz 作业不适用于 @Autowired 作业实例,因为quartz 使用类名来创建实例,因此没有可用的实例变量可用于开箱即用的 D.I。现在我可以在您的解决方案中使用自动装配的实例了!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 2015-08-17
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多