2016-03-24 6 views
0

私はオブジェクトを持っています。仕事をするために必要なすべてのものがうまく構成されています。 1日に一度run()と呼ぶことができれば、私の人生は完結するでしょう。Quartzで既存のオブジェクトのメソッドを呼び出すにはどうすればよいですか?

明らかに、私はスケジュールとトリガーを作成する方法を知っています。しかし、すべてのスケジュールを設定するメソッドは、クラスの新しいインスタンスを作成したいJobDetailを取ります。私が持っているものをどうやって使うのですか?

要するに、Springを使用しないで、Quartzを使ってオブジェクト上のメソッドを呼び出す方法がありますか?

+1

です。あなたがしていないことを想いましょう。オブジェクトのインスタンスを回復するためにSingletonパターンを使用するとどうなりますか? – RubioRic

+0

SpringにMethodInvokingJobDetailFactoryBeanがあります。もう1つのオプションは、オブジェクトを(ジョブデータなどから)取り出して呼び出すジョブクラスを作成することです。 – BobTheBuilder

+0

もしあなたがSpringを使っているなら、ここにはたくさんの解決策がありますhttp://stackoverflow.com/questions/6990767/inject-bean-reference-into-a-quartz-job-in-spring – RubioRic

答えて

1

あなたは春とクォーツを使用している場合は、次の操作を行うことができます

Sample code

MethodInvokingJobDetailFactoryBean jobDetailfactory = new MethodInvokingJobDetailFactoryBean(); 
jobDetailfactory.setTargetObject(configuredObject); 
jobDetailfactory.setTargetMethod("methodName"); 

ここconfiguredObjectあなたうまく構成されたオブジェクトとmethodNameが呼び出されるメソッドの名前です。このクラスにconfiguredObjectをオートワイヤーすることができます。

+1

しかし、OPはしたくないオブジェクト/ヘルパーの新しいインスタンスを取得する – RubioRic

+0

お返事ありがとうございました。 – M4ver1k

+0

ああ、申し訳ありませんが、春のすべて(またはTBH any)を取り込みたくありません。 –

1

正しく取得した場合、Quartz JobBuilderを使用して独自のjobDetailsクラスを使用してQuartz JobDetailオブジェクトを構築できます。もしあなたがそれを要求されていなければ、私に知らせてください。

ジョブ情報がジョブ詳細を持つ独自のクラスであるとします。以下のように使用することができます:

JobDataMap jobDataMap =新しいJobDataMap();

Map<String, Object> jobParams = jobInfo.getJobParams(); 
for (String paramKey : jobParams.keySet()) { 
    jobDataMap.put(paramKey, jobParams.get(paramKey)); 
} 

jobBuilder.ofType((Class<? extends Job>) Class.forName(jobInfo.getJobClass())) 
    .withIdentity(jobInfo.getName(), jobInfo.getGroup()) 
    .withDescription(jobInfo.getDescription()).storeDurably(jobInfo.isStoreDurably()) 
    .usingJobData(jobDataMap); 

JobDetail jobDetail = jobBuilder.build(); 
0

代わりに水晶を使用するのではなく、あなたが使用したほうが良いかもしれませんビルトインjava.util.concurrent.ScheduledExecutorServiceとそのscheduleAtFixedRate()方法。

たとえば

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1, 
     new ThreadFactory() { 

      @Override 
      public Thread newThread(Runnable runnable) { 
       Thread t = Executors.defaultThreadFactory().newThread(runnable); 
       t.setDaemon(true); 
       return t; 
      } 
     }); 


scheduler.scheduleAtFixedRate(new Runnable() { 

     @Override 
     public void run() { 
      myLovelyObject.run(); 
     } 
    }, 0, 24, TimeUnit.HOURS); 

あなたはクォーツを使用する必要がある場合、あなたは常に仕事のクラスの静的フィールドにオブジェクトへの参照を格納することができます。エレガントではありませんが、まさに世界の終わりではありません。

+0

これは私が必要とするcronパターン解析です! –

+0

['org.quartz.CronExpression'](https://github.com/quartz-scheduler/quartz/blob/master/quartz-core/src/main/java/org/quartz/CronExpression.java)を見てください。 )。 cronパターン解析は完全に自己完結型です。そのクラスをプロジェクトにコピーするだけでも可能です。 –

0

はここにいくつかのコード(Kotlin)あなたがオブジェクトと春のような予定のクォーツジョブを実行するためにいくつかのフレームワークを使用している場合、私は知らない

fun createJobDetail(jobName: String, function:() -> Unit) = JobBuilder.newJob(MyJob::class.java) 
    .withIdentity(jobName) 
    .usingJobData(JobDataMap(mapOf(jobDataKey to function))) 
    .build()` 

@DisallowConcurrentExecution 
class MyJob : Job { 
    @Suppress("UNCHECKED_CAST") 
    override fun execute(context: JobExecutionContext) { 
     try { 
      (context.jobDetail.jobDataMap[jobDataKey] as() -> Unit)() 
     } catch(e: Exception) { 
      throw JobExecutionException(e) 
     } 
    } 
} 
関連する問題