Quartz jdbc jobstore by Hibernate connection

ผมกำหนดโจทย์ขึ้นมาว่า ทำอย่างไรถึงจะให้ Quartz เก็บ Job ลง Database โดยใช้ Hibernate เพราะผมดูแลเว็บที่ใช้ Hibernate อยู่แล้ว (Connection เป็น jdbc ธรรมดาไม่ได้เรียกผ่าน Datasource) และมีความต้องการใช้งาน Quartz และใช้ jdbc jobstore โดยผมไม่อยากไป config jdbc ใหม่อีกครั้ง ซึ่ง Quartz ก็ไม่ได้รองรับ Hibernate แต่ก็ยังทิ้งช่องทางให้สามารถเรียก Connection จาก Hibernate ได้ผ่านทาง ConnectionProvider

HibernateConnectionProvider


Quartz ไม่ได้เตรียมคลาสไว้ให้ เราต้องทำการ Implement เองดังนี้

package com.magicalcyber.helloquartz.util;

import org.hibernate.internal.SessionFactoryImpl;
import org.quartz.utils.ConnectionProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Connection;
import java.sql.SQLException;

/**
 * Created by MagicalCyber on 10/28/2014.
 */
public class HibernateConnectionProvider implements ConnectionProvider {
    private static final Logger log = LoggerFactory.getLogger(HibernateConnectionProvider.class);

    @Override
    public Connection getConnection() throws SQLException {
        log.info("Quartz getting connection...");
        Connection connection = ((SessionFactoryImpl) HibernateUtil.getSessionFactory()).getConnectionProvider().getConnection();
        return connection;
    }

    @Override
    public void shutdown() throws SQLException {

    }
}

จากนั้นทำการตั้งค่าใน quartz properties ส่วนของ datasource ดังนี้

org.quartz.scheduler.instanceName = MagicalcyberScheduler
org.quartz.threadPool.threadCount = 5

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.isClustered = false
org.quartz.jobStore.dataSource = magicalcyberDS
org.quartz.dataSource.magicalcyberDS.connectionProvider.class = com.magicalcyber.helloquartz.util.HibernateConnectionProvider

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = quartz.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

จากตัวอย่าง properties ของผมจะพบว่าไม่มีการระบุพวก url, username, password สำหรับต่อ database ไว้เลย ซึ่งจุดหลักอยู่ที่

org.quartz.dataSource.magicalcyberDS.connectionProvider.class = com.magicalcyber.helloquartz.util.HibernateConnectionProvider

เมื่อทำการ Start Server ตัว Quartz ก็จะไปเรียกใช้คลาสนี้และทำการปิด connection ให้เองด้วย

quartz-startup

อ้างอิง


http://forums.terracotta.org/forums/posts/list/4002.page

Code


https://github.com/magicalcyber/helloquartzhibernate

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s