Job Scheduling Using Quartz

Quartz เป็นบริการจัดตารางเวลางาน open-source ที่มีฟีเจอร์ครบถ้วนซึ่งสามารถรวมหรือใช้ร่วมกับแอปพลิเคชัน Java ใดก็ได้ตั้งแต่แอปพลิเคชันแบบ stand-alone ที่เล็กที่สุดไปจนถึงระบบอีคอมเมิร์ซที่ใหญ่ที่สุด Quartz สามารถใช้เพื่อสร้างตารางเวลาที่เรียบง่ายหรือซับซ้อนสำหรับการดำเนินงานหลายสิบ ร้อย หรือแม้แต่หมื่นงาน; งานที่มีการกำหนดงาน Java มาตรฐานเป็นส่วนประกอบอาจมีการดำเนินการแทบทุกอย่างที่คุณตั้งโปรแกรมไว้ให้ทำ

หากแอปพลิเคชันของคุณมีงานที่ต้องเกิดขึ้นในช่วงเวลาใดก็ตามหรือหากระบบของคุณมีงานบำรุงรักษาที่เกิดขึ้นอีก Quartz อาจเป็นโซลูชันที่เหมาะสมที่สุดของคุณ

มาดูกันว่า Quartz ทำงานอย่างไรในคลาวด์

การสร้าง Environment

1. เข้าสู่ระบบ Ruk-Com Cloud Dashboard

2. คลิกปุ่ม New Environment

3. เลือก Tomcat เป็นแอปพลิเคชันเซิร์ฟเวอร์และตั้งค่าขีดจำกัด cloudlet จากนั้นใส่ชื่อ environment ตัวอย่างเช่น quartz และคลิก Create

รอซักครู่เพื่อสร้าง environment ของคุณ

การสร้างแอปพลิเคชัน

1. สร้างเว็บแอปพลิเคชันของคุณ (ในกรณีของเราใช้แอปพลิเคชัน Maven) และเพิ่มไฟล์ pom.xml เพื่อรวม Quartz libraries เข้ากับโปรเจกต์ของคุณ

<!-- Quartz API -->
    <dependency>
        <groupId>opensymphony</groupId>
        <artifactId>quartz</artifactId>
        <version>1.6.3</version>
    </dependency>
    <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
        <version>3.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.directory.studio</groupId>
        <artifactId>org.apache.commons.logging</artifactId>
        <version>1.1.1</version>
    </dependency>

2. สร้างโปรเจกต์ของคุณ

3. สร้าง Java class ใหม่ซึ่งจะดำเนินการกับงานของคุณและนี่คือตัวอย่างซึ่งแสดงเวลาของเซิร์ฟเวอร์:

package com;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job
{
    public void execute(JobExecutionContext context)
    throws JobExecutionException {

        System.out.println("Server Time: " + new Date());
    }
}

4. สร้าง Servlet ใหม่ (คุณสามารถใช้ logic อื่นได้อย่างง่ายดาย) และระบุ Quartz trigger เพื่อกำหนดเหตุการณ์ตารางเวลาที่ Quartz จะรันงานของคุณ ในกรณีของเราได้สร้าง QuartzServlet.java ซึ่งมีคำสั่ง (การบันทึกที่ดำเนินการในคลาส HelloJob) ที่ดำเนินการทุกนาที

package com;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {

            JobDetail job = new JobDetail();
            job.setName("dummyJobName");
            job.setJobClass(HelloJob.class);

            CronTrigger trigger = new CronTrigger();
            trigger.setName("TriggerName");
            trigger.setCronExpression("0 */1 * * * ?");

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

        } catch (SchedulerException ex) {
            Logger.getLogger(QuartzServlet.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParseException ex) {
            Logger.getLogger(QuartzServlet.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    public String getServletInfo() {
        return "Short description";
    }
}



5. สร้างโปรเจกต์ของคุณเป็นไฟล์ WAR

Deploy Application

1. กลับไปที่หน้า Ruk-Com Cloud Dashboard และอัปโหลดไฟล์ WAR ที่คุณเพิ่งสร้างขึ้น

2. Deploy แอปพลิเคชันของคุณกับ environment ที่สร้างไว้ก่อนหน้านี้

3. เปิดแอปของคุณในเบราว์เซอร์และตรวจสอบผลลัพธ์ ในกรณีของเราให้ไปที่ quartz context (http://{env_name}.{hoster_domain}/quartz ตามการแมป Servlet “QuartzServlet”) และตรวจสอบบันทึกการใช้งานแอปพลิเคชัน logs

คุณจะเห็นการจัดตารางงานโดยใช้ Quartz ทำงานได้อย่างมีเสน่ห์

เราหวังว่าคำแนะนำเกี่ยวกับการ deploy Quartz จะเป็นประโยชน์สำหรับคุณ