2016-03-28 14 views
4

私は、thisチュートリアルに従って、Springでジョブをスケジュールしています。チュートリアルのスケジュールでSpring(およびQuartz)を使用してスケジュールされたジョブを動的に開始する方法は?

は、次のコードによって開始されます。代わりにメイン使用の

public static void main(String args[]){ 
    AbstractApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml"); 
} 

、私は例えば、どこでも自分のアプリケーション内から呼び出すことができる方法でジョブを開始したいと思います:

public void startJobs() { 
    // what should this method do to start the jobs? 
} 

次のことはできますか?

public void startJobs() { 
    AbstractApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml"); 
} 

これは良い習慣と考えられますか?

基本的に私が達成したいのは、いつでも(私がstartJobs()メソッドを呼び出すたびに)、メインメソッドの起動時ではなく、いつでもジョブを開始できることです。

どうすればいいですか?

答えて

2

もっと簡単に@Scheduledアノテーションを使用してください。

方法1)@Scheduled注釈に固定遅延属性を使用してタスクスケジューリング

@Scheduled(fixedDelay = 5000) 

方法2)@Scheduled注釈にクーロン式を使用してタスクスケジューリング

@Scheduled(cron="*/5 * * * * ?") 

方法3)タスクスケジューリング用いクーロンプロパティファイルからの式

@Scheduled(cron = "${cron.expression}") 

例の例here

+6

私が言ったように、私が達成したいのは、いつでもメソッドを呼び出すことによってコードからジョブを開始することです。 @Scheduledアノテーションを使用して手動でスケジューリングを開始するにはどうすればよいですか? – earthw0rmjim

+0

データベースから読み込むプロパティファイルを読み込むのではなくてはどうでしょうか?実行時に式を更新する方法はありますか? – tiagocarvalho92

3

石英と春を使用してスケジューリングしましたか。はいの場合は正常に動作していますか?共有したリンクの例は "The Task Namespace"に属します。

Quartzでは、Trigger、Job、JobDetailオブジェクトを使用してあらゆる種類のジョブのスケジューリングを実現します。クォーツの背後にある基本的な概念については、春とそれを統合すること

http://quartz-scheduler.org/documentation/quartz-2.2.x/quick-start

を見て、この春、石英のも

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-quartz-jobdetail

XML設定を見てください。

<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
     <property name="jobRepository" ref="jobRepository" /> 
</bean> 
    <bean 
     class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor"> 
     <property name="jobRegistry" ref="jobRegistry" /> 
    </bean> 

    <bean id="jobRegistry" 
     class="org.springframework.batch.core.configuration.support.MapJobRegistry" /> 

    <bean name="csvLoaderJobDetail" 
     class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> 
     <property name="jobClass" value="com.example.CSVloader.ScheduledJob" /> 
     <property name="jobDataMap"> 
      <map> 
       <entry key="csvData" value="value1" /> 
       <entry key="date" value="25/09/2015" /> 
       <entry key="csvId" value="1" /> 
       <entry key="jobName" value="csvLoadJob" /> 
       <entry key="jobLocator" value-ref="jobRegistry" /> 
       <entry key="jobLauncher" value-ref="jobLauncher" /> 
      </map> 
     </property> 
     <property name="durability" value="true" /> 
    </bean> 

    <bean id="csvLoaderTrigger" 
     class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> 
     <property name="jobDetail" ref="csvLoaderJobDetail" /> 
     <property name="cronExpression" value="0 0 12 * * ?" /> 
    </bean> 

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
     <property name="jobDetails"> 
      <list> 
       <ref bean="csvLoaderJobDetail" /> 
      </list> 
     </property> 
     <property name="triggers"> 
      <list> 
       <ref bean="csvLoaderTrigger" /> 
      </list> 
     </property> 
     <property name="quartzProperties"> 
      <props> 
       <prop key="org.quartz.scheduler.skipUpdateCheck">true</prop> 
      </props> 
     </property> 
    </bean> 

手動でジョブを起動するには、SchedulerFactoryBeanをSpring Beanに挿入する必要があります。まず、クォーツスケジューラで作成されたすべてのジョブを取得し、各ジョブのジョブキーとジョブグループを使用して手動で任意のジョブをトリガする必要があります。

@Autowired 
    private SchedulerFactoryBean schedulerFactory; 

    org.quartz.Scheduler scheduler = schedulerFactory.getScheduler(); 

    // loop jobs by group 
    for (String groupName : scheduler.getJobGroupNames()) { 

      // get jobkey 
      for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher 
    .jobGroupEquals(groupName))) { 

       String jobName = jobKey.getName(); 
       String jobGroup = jobKey.getGroup(); 

       scheduler.triggerJob(jobName, jobGroup); 
      } 
    } 

ここで、jobNameとjobGroupを含むObjectのリストを作成して、ジョブを手動でトリガーすることができます。

+0

リンクが間違っていた、私はちょうどそれを編集しました。石英+スプリングを使用する。私の問題は、アプリケーションの起動時に自動的に起動するのではなく、手動で(メソッドを呼び出して)ジョブを起動する方法がわかりません。 – earthw0rmjim

+0

私の編集した答えを見てください。それがあなたの必要条件を満たすかどうか教えてください。 – Dinesh

+0

@ user8、上記の回答はあなたの要件を満たしていますか? – Dinesh

関連する問題