2016-04-26 15 views
0

私はクライアント用のQuartz(サーバではない)を設定しています。私は新しいJobDetail jobを作成する必要がある場合、私は、次の実行時に新しいJobDetailジョブを作成する方法は?

JobDetail job = JobBuilder.newJob(TestJob.class) 
     .withIdentity("dummyJobName", "group1").build(); 

     Trigger trigger = . . 

     Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 
     scheduler.start(); 
     scheduler.scheduleJob(job, trigger); 

は当初、私は私がnewJobにクラスのオブジェクトを養うだろうと思っただろう。

しかし、newJobメソッドでは、クラスを引数として取ります(クラスのインスタンスではありません)。 JobBuilder org.quartz.JobBuilder.newJob(Class<? extends Job> jobClass)

実行時に新しいクラスを作成することはできません。これは少なくとも効率的ではありません。

したがって、実行時に新しいJobDetail jobを追加するにはどうすればよいですか?


実行時にTestJobクラスを抽象化する必要があります。私はここで非常に混乱しています

stackoverflowに同様の質問がありました。したがって、「クォーツスケジューラのJobFactory APIは、カスタムクラスローダを介してジョブクラスをロードし、ジョブを真に動的に追加できるようになります」。

どのようにですか?

答えて

1

シリアル化しない限り、オブジェクトから直接JobDetailを作成することはできません(これはお勧めできません)。あなたができることは、HashMapを作成し、それにすべてのデータを追加して以下を実行することです。

Map<String, Serializable> jobData = Maps.newHashMap(); 
     jobData.put("yourkey", "youdata"); 
     ... 
JobDetail job = newJob(TestJob.class).usingJobData(jobData) 
     .build(); 
     //build your trigger 
scheduler.scheduleJob(job, trigger) 
+0

ありがとうございました。しかし、これは、新しい仕事が追加されるたびにすべてのジョブをリロードする必要があることを意味します。 – Emily

+0

クォーツスケジューラの未知のクラスを処理する代わりに、コードベースのRMIを使用することはできませんか? – mam10eks

+0

新しいジョブを作成するために既存のジョブをリロードする必要はありません。この特定のトリガがここで指定したjobdetailsで起動したときに呼び出される同じJobクラス( 'TestJob.class')を使用しているだけです。ジョブの詳細のみが動的で、TestJobクラスのexecuteメソッドが動的データとともに呼び出されます。 –

関連する問題