Chuyển đến nội dung chính

Kết hợp Quarzt job ( Schedule ) và Spring 4

Kết hợp Quarzt job ( Schedule ) và Spring 4

Ở bài viết này tôi sẽ trình bày cho các bạn thấy làm thế nào để lên lịch chạy chức năng ( functions ) sử dụng Quazrt với Spring.
Giờ bắt đầu nào.

Following technologies being used:

Spring 4.0.6.RELEASE
Quartz 2.2.1
Maven 3
JDK 1.6
Eclipse

Content Project

Bước 1: cung cấp Dependencies file pom.xml
<project xmlns="<a class="vglnk" href="http://maven.apache.org/POM/4.0.0" rel="nofollow"><span>http</span><span>://</span><span>maven</span><span>.</span><span>apache</span><span>.</span><span>org</span><span>/</span><span>POM</span><span>/</span><span>4</span><span>.</span><span>0</span><span>.</span><span>0</span></a>" xmlns:xsi="<a class="vglnk" href="http://www.w3.org/2001/XMLSchema-instance" rel="nofollow"><span>http</span><span>://</span><span>www</span><span>.</span><span>w3</span><span>.</span><span>org</span><span>/</span><span>2001</span><span>/</span><span>XMLSchema</span><span>-</span><span>instance</span></a>"
  xsi:schemaLocation="<a class="vglnk" href="http://maven.apache.org/POM/4.0.0" rel="nofollow"><span>http</span><span>://</span><span>maven</span><span>.</span><span>apache</span><span>.</span><span>org</span><span>/</span><span>POM</span><span>/</span><span>4</span><span>.</span><span>0</span><span>.</span><span>0</span></a> <a class="vglnk" href="http://maven.apache.org/xsd/maven-4.0.0.xsd" rel="nofollow"><span>http</span><span>://</span><span>maven</span><span>.</span><span>apache</span><span>.</span><span>org</span><span>/</span><span>xsd</span><span>/</span><span>maven</span><span>-</span><span>4</span><span>.</span><span>0</span><span>.</span><span>0</span><span>.</span><span>xsd</span></a>">
  <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.0.6.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.2</version>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
 
</project>
Bước 2: Config jobs in Quartz Schedule. Có 2 kiểu config job sử dụng Quartz kiểu 1:Sử dụng JobDetailFactoryBean kiểu này khá phức tạp nhưng rất đa dụng và được sử dụng nhiều trong dự án
<!-- 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>
Kiểu 2: Sử dụng MethodInvokingJobDetailFactoryBean kiểu này đơn giản dễ Config hơn nhưng cũng đồng nghĩa sẽ không đa dụng được trong nhiều trường hợp
<!-- 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>
Bên dưới là jobclass (ScheduledJob) implementation. Package com.websystique.spring.quartz.ScheduledJob
package com.websystique.spring.quartz;
 
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
 
import com.websystique.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;
    }
}
Bước 3: Configure đê sử dụng Quartz Scheduler với loại 1:
<!-- 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>
ở đây 0/5 * * ? * SAT-SUNcó ngĩa cứ cứ mỗi 6 giây vào thứ 7 và chủ nhật thì công việc sẽ được thực hiên Với Loại 2: sẽ đơn giản hơn
<!-- 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>
ở đây thời gian chạy sẽ là sau mỗi 1 giây và lặp lại mỗi 2 giây **Bước 4: Configure SchedulerFactoryBean **
src/main/resources/quartz-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="<a class="vglnk" href="http://www.springframework.org/schema/beans" rel="nofollow"><span>http</span><span>://</span><span>www</span><span>.</span><span>springframework</span><span>.</span><span>org</span><span>/</span><span>schema</span><span>/</span><span>beans</span></a>"
    xmlns:xsi="<a class="vglnk" href="http://www.w3.org/2001/XMLSchema-instance" rel="nofollow"><span>http</span><span>://</span><span>www</span><span>.</span><span>w3</span><span>.</span><span>org</span><span>/</span><span>2001</span><span>/</span><span>XMLSchema</span><span>-</span><span>instance</span></a>" xmlns:context="<a class="vglnk" href="http://www.springframework.org/schema/context" rel="nofollow"><span>http</span><span>://</span><span>www</span><span>.</span><span>springframework</span><span>.</span><span>org</span><span>/</span><span>schema</span><span>/</span><span>context</span></a>"
    xsi:schemaLocation="<a class="vglnk" href="http://www.springframework.org/schema/beans" rel="nofollow"><span>http</span><span>://</span><span>www</span><span>.</span><span>springframework</span><span>.</span><span>org</span><span>/</span><span>schema</span><span>/</span><span>beans</span></a> <a class="vglnk" href="http://www.springframework.org/schema/beans/spring-beans-4.0.xsd" rel="nofollow"><span>http</span><span>://</span><span>www</span><span>.</span><span>springframework</span><span>.</span><span>org</span><span>/</span><span>schema</span><span>/</span><span>beans</span><span>/</span><span>spring</span><span>-</span><span>beans</span><span>-</span><span>4</span><span>.</span><span>0</span><span>.</span><span>xsd</span></a>
                            <a class="vglnk" href="http://www.springframework.org/schema/context" rel="nofollow"><span>http</span><span>://</span><span>www</span><span>.</span><span>springframework</span><span>.</span><span>org</span><span>/</span><span>schema</span><span>/</span><span>context</span></a> <a class="vglnk" href="http://www.springframework.org/schema/context/spring-context-4.0.xsd" rel="nofollow"><span>http</span><span>://</span><span>www</span><span>.</span><span>springframework</span><span>.</span><span>org</span><span>/</span><span>schema</span><span>/</span><span>context</span><span>/</span><span>spring</span><span>-</span><span>context</span><span>-</span><span>4</span><span>.</span><span>0</span><span>.</span><span>xsd</span></a>">
 
    <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: Tạo Class POJO đơn giản để sử dụng Quarzt com.websystique.spring.scheduling.MyBean
package com.websystique.spring.scheduling;
 
import org.springframework.stereotype.Component;
 
@Component("myBean")
public class MyBean {
 
    public void printMessage() {
        System.out.println("I am called by MethodInvokingJobDetailFactoryBean using SimpleTriggerFactoryBean");
    }
     
}
com.websystique.spring.scheduling.AnotherBean
package com.websystique.spring.scheduling;
 
import org.springframework.stereotype.Component;
 
@Component("anotherBean")
public class AnotherBean {
     
    public void printAnotherMessage(){
        System.out.println("I am called by Quartz jobBean using CronTriggerFactoryBean");
    }
     
}
Bước 6: Tạo Main và chạy ứng dụng
package com.websystique.spring;
 
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");
    }
 
}
chạy bạn sẽ thấy kết quả:
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 SimpleTriggerFactoryBea
Hy Vọng bài viết này sẽ giúp ích cho bạn

Nhận xét

Bài đăng phổ biến từ blog này

Eager/Lazy Loading In Hibernate

Eager/Lazy Loading In Hibernate Following technologies being used: Spring Boot 2 Maven Eclipse 1. Introduction Khi làm việc với ORM chắc hẳn các bạn sẽ bắt gặp 2 loại eagerloading lazyloading. Ở bài viết này tôi sẽ trình bày về sự khác biệt giữa hai loại này. 2. Maven Dependencies <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.2.Final</version> </dependency> ở đây chúng ta sử dụng hibernate 5. 3. Eager and Lazy Loading Eager Loading  được thiết kế giúp cho việc khởi tạo đối tượng ngay lập tức. Lazy Loading  được thiết kế giúp cho việc trì hoãn việc khởi tạo đối tưởng miễn là có thể theo dõi ví dụ sau: class  UserLazy @Entity @Table(name = "USER") public class UserLazy implements Serializable { @Id @GeneratedValue @Column(name = "USER_ID") private Long userId; @OneToMany(fetch = FetchType.LAZY, mappedBy ...

Giới thiệu về Sevices và dependency injection trong Angular 7

Sevice là một danh mục rộng bao gồm bất kỳ value, function, hoặc tính năng mà ứng dụng cần. Một service là một class thông thượng được định nghĩa với mục đích rõ ràng. Angurlar phân biệt các thành phần từ các service để tăng tính modul và khả năng tái sử dụng. Một Component có thể giao một số công việc cho các service  như fetching data từ server, validating user input, hoặc logging trực tiếp... Bằng việc xác định xử lý các tiến trình trong một lớp  injectable service class  Bạn sẽ làm các tác vụ đó trở nên có sẵn tới bất kỳ component. Bạn cũng có thể làm ứng dụng của bạn thích ứng hơn bằng cách tiêm nhiều provider của cùng loại dịch vụ. Service examples Dưới đây là một ví dụ show consolog trên browser  src/app/logger.service.ts (class) export class Logger { log(msg: any) { console.log(msg); } error(msg: any) { console.error(msg); } warn(msg: any) { console.warn(msg); } } Service có thể được phụ thuộc vào các Service khác. Theo ví dụ dưới đây , ...

Spring boot Download and upload File ( phần 1 Backend )

Ở bài viết này mình sẽ trình bày mình sẽ tring bày làm thế nào để upload và download file trong một  Restful spring boot web service (  Công nghệ sử dụng: Spring Boot Mysql JPA/Hibernate Content Project:     Cấu Trúc thư mục : JPA and MySQL dependencies   Tôi sẽ lưu trữ file trong mysql database vậy nên cần dependencies về mysql  và jpa. File pom  : < dependencies > < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-web </ artifactId > </ dependency > < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-data-jpa </ artifactId > </ dependency > < dependency > < groupId > mysql </ groupId > < artifactId > mysql-connector-java </ artifactId > < scope > runtime </ scope > </ dependency...