我没有尝试过这些,但值得一试。
1)考虑使用Quartz camel endpoint。如果我的理解是正确的,Apache Camel 可以让您动态创建骆驼路线。它只需要将 camel-context.xml 部署到容器中,同时考虑到所需的类已经在容器的类路径中可用。
2) Quartz 让您以声明方式创建作业,即使用作业和触发器的 xml 配置。您可以在此处找到更多信息。
3) 现在这需要一些努力;-)
创建一个接口,该接口具有您将作为作业的一部分执行的方法。可以说这将有一个名为的方法
public interface MyDynamicJob
{
public void executeThisAsPartOfJob();
}
创建 Job 方法的实例。
public EmailJob implements MyDynamicJob
{
@Override
public void executeThisAsPartOfJob()
{
System.out.println("Sending Email");
}
}
现在在您的主调度程序引擎中,使用观察者模式来动态存储/启动作业。就像是,
HashMap jobs=new HashMap<String,MyDynamicJob>();
// call this method to add the job dynamically.
// If you add a job after the scheduler engine started , find a way here how to reiterate over this map without shutting down the scheduler :-).
public void addJob(String someJobName,MyDynamicJob job)
{
jobs.add(someJobName,job);
}
public void initiateScheduler()
{
// Iterate over the jobs map to get all registered jobs. Create
// Create JobDetail instances dynamically for each job Entry. add your custom job class as a part of job data map.
Job jd1=JobBuilder.newJob(GenericJob.class)
.withIdentity("FirstJob", "First Group").build();
Map jobDataMap=jd1.getJobDataMap();
jobDataMap.put("dynamicjob", jobs.get("dynamicjob1"));
}
public class GenericJob implements Job {
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("Executing job");
Map jdm=arg0.getJobDetail().getJobDataMap();
MyDynamicJob mdj=jdm.get("dynamicjob");
// Now execute your custom job method here.
mdj.executeThisAsPartOfJob();
System.out.println("Job Execution complete");
}
}