zoukankan      html  css  js  c++  java
  • Spring 4 + Quartz 2.2.1 Scheduler Integration Example

    In this post we will see how to schedule Jobs using Quartz Scheduler with Spring. Spring provides couple of classes that simplify the usage of Quartz within Spring-based applications.

    Step 1: Provide Dependencies in Maven pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.websystique.spring</groupId>
      <artifactId>SpringQuartzIntegrationExample</artifactId>
      <version>1.0.0</version>
      <packaging>jar</packaging>
      <name>SpringQuartzIntegrationExample</name>
    
        <properties>
            <springframework.version>4.2.4.RELEASE</springframework.version>
            <quartz.version>2.2.1</quartz.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${springframework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>${springframework.version}</version>
            </dependency>
            <!-- Transaction dependency is required with Quartz integration -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>${springframework.version}</version>
            </dependency>        
            <!-- Quartz framework -->
            <dependency>
                <groupId>org.quartz-scheduler</groupId>
                <artifactId>quartz</artifactId>
                <version>${quartz.version}</version>
            </dependency>
        </dependencies>
        <build>
         <pluginManagement>
           <plugins>
              <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                   <source>1.7</source>
                   <target>1.7</target>
                   <encoding>UTF-8</encoding>
                   <showDeprecation>true</showDeprecation>
                   <showWarnings>true</showWarnings>
                </configuration>
              </plugin>
            </plugins>
          </pluginManagement>
        </build>
    </project>

    Step 2: Configure Jobs in Quartz Scheduler

    There are 2 ways to configure a Job in Spring using Quartz

    A : Using MethodInvokingJobDetailFactoryBean

    Really handy when you just need to invoke a method on a specific bean. This is the simplest among two.

    <!-- For times when you just need to invoke a method on a specific object -->
    <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="myBean" />
        <property name="targetMethod" value="printMessage" />
    </bean>

    Above job configuration simply invokes printMessage method of bean myJobBean which is simple POJO

    B : Using JobDetailFactoryBean

    When you need more advanced setup, need to pass data to job, being more flexible.

    <!-- For times when you need more complex processing, passing data to the scheduled job -->
    <bean name="complexJobDetail"    class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="com.**.spring.quartz.ScheduledJob" />
        <property name="jobDataMap">
            <map>
                <entry key="anotherBean" value-ref="anotherBean" />
            </map>
        </property>
        <property name="durability" value="true" />
    </bean>

    jobClass refers to a class which extends QuartzJobBean, an implementation of Quartz job interface. On invocation of this job, it’s executeInternal method gets called.
    jobDataMap provides opportunity to pass some data to underlying job bean. In this case, we are passing a bean ‘anotherBean’ which will be used by ScheduledJob.

    Below is the referred jobclass (ScheduledJob) implementation.

    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.springframework.scheduling.quartz.QuartzJobBean;
    
    import com.bianjq.spring.scheduling.AnotherBean;
    
    public class ScheduledJob extends QuartzJobBean{
    
        
        private AnotherBean anotherBean; 
        
        
        @Override
        protected void executeInternal(JobExecutionContext arg0)
                throws JobExecutionException {
            anotherBean.printAnotherMessage();
        }
    
        public void setAnotherBean(AnotherBean anotherBean) {
            this.anotherBean = anotherBean;
        }
    }

    Step 3: Configure Triggers to be used in Quartz Scheduler

    Trigger defines the time when scheduler will run your scheduled job. There are two possible trigger type:

    A: Simple Trigger , using SimpleTriggerFactoryBean
    You can specify start time, delay between triggers and repeatInterval(frequency) to run the job.

    <!-- Run the job every 2 seconds with initial delay of 1 second -->
    <bean id="simpleTrigger"  class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="simpleJobDetail" />
        <property name="startDelay" value="1000" />
        <property name="repeatInterval" value="2000" />
    </bean>

    B: Cron Trigger , using CronTriggerFactoryBean

    It’s more flexible and allows you to choose scheduled job at specific instance (time, day, date,..) and frequency in future.

    <!-- Run the job every 5 seconds only on Weekends -->
    <bean id="cronTrigger"  class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="complexJobDetail" />
        <property name="cronExpression" value="0/5 * * ? * SAT-SUN" />
    </bean>

    Step 4: Configure SchedulerFactoryBean that creates and configures Quartz Scheduler

    SchedulerFactoryBean glues together jobDetails and triggers to Configure Quartz Scheduler

    <!-- Scheduler factory bean to glue together jobDetails and triggers to Configure Quartz Scheduler -->
    <bean  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobDetails">
            <list>
                <ref bean="simpleJobDetail" />
                <ref bean="complexJobDetail" />
            </list>
        </property>
     
        <property name="triggers">
            <list>
                <ref bean="simpleTrigger" />
                <ref bean="cronTrigger" />
            </list>
        </property>
    </bean>

    Below shown is complete context file for our example

    src/main/resources/quartz-context.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
     
        <context:component-scan base-package="com.websystique.spring" />
     
     
        <!-- For times when you just need to invoke a method on a specific object -->
        <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <property name="targetObject" ref="myBean" />
            <property name="targetMethod" value="printMessage" />
        </bean>
     
     
        <!-- For times when you need more complex processing, passing data to the scheduled job -->
        <bean name="complexJobDetail"    class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
            <property name="jobClass" value="com.websystique.spring.quartz.ScheduledJob" />
            <property name="jobDataMap">
                <map>
                    <entry key="anotherBean" value-ref="anotherBean" />
                </map>
            </property>
            <property name="durability" value="true" />
        </bean>
     
     
        <!-- Run the job every 2 seconds with initial delay of 1 second -->
        <bean id="simpleTrigger"  class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
            <property name="jobDetail" ref="simpleJobDetail" />
            <property name="startDelay" value="1000" />
            <property name="repeatInterval" value="2000" />
        </bean>
     
     
        <!-- Run the job every 5 seconds only on Weekends -->
        <bean id="cronTrigger"  class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
            <property name="jobDetail" ref="complexJobDetail" />
            <property name="cronExpression" value="0/5 * * ? * SAT-SUN" />
        </bean>
     
     
        <!-- Scheduler factory bean to glue together jobDetails and triggers to Configure Quartz Scheduler -->
        <bean  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="jobDetails">
                <list>
                    <ref bean="simpleJobDetail" />
                    <ref bean="complexJobDetail" />
                </list>
            </property>
     
            <property name="triggers">
                <list>
                    <ref bean="simpleTrigger" />
                    <ref bean="cronTrigger" />
                </list>
            </property>
        </bean>
     
    </beans>

    Step 5: Create simple POJO’s Task Beans used in this example

    import org.springframework.stereotype.Component;
    
    @Component("myBean")
    public class MyBean {
    
        public void printMessage() {
            System.out.println("I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean");
        }
        
    }
    import org.springframework.stereotype.Component;
    
    @Component("anotherBean")
    public class AnotherBean {
        
        public void printAnotherMessage(){
            System.out.println("I am called by Quartz jobBean using CronTriggerFactoryBean");
        }
        
    }

    Step 6: Create Main, and Run the application

    import org.springframework.context.support.AbstractApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class AppMain {
        public static void main(String args[]){
            AbstractApplicationContext context = new ClassPathXmlApplicationContext("quartz-context.xml");
        }
    
    }

    Run it as Java application, you will see following output.

    INFO: Starting Quartz Scheduler now
    I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean
    I am called by Quartz jobBean using CronTriggerFactoryBean
    I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean
    I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean
    I am called by Quartz jobBean using CronTriggerFactoryBean
    I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean
    I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean
    I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean
    I am called by Quartz jobBean using CronTriggerFactoryBean
    I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean
  • 相关阅读:
    ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof
    ios开发Base64编码以及加密相关学习
    ios开发网络学习AFN三:AFN的序列化
    iOS开发AFN使用二:AFN文件下载与文件上传
    Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.4——更新新版本的Gradle
    Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.3——用Eclipse ADT导出App
    Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.2——将Eclipse开发的项目导入到AndroidStudio
    Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.1——设置项目参数
    Android开发:《Gradle Recipes for Android》阅读笔记1.7——仓库配置
    Android开发:《Gradle Recipes for Android》阅读笔记1.6——使用android studio添加依赖
  • 原文地址:https://www.cnblogs.com/halberts/p/5909446.html
Copyright © 2011-2022 走看看