Liferayのバッチの作成


はじめに

定期的に実行するバッチ処理はシステムよくあります。
Javaのスケジューラのライブラリとしてquartzは有名です。
quartz:http://www.quartz-scheduler.org/

LiferayのスケジューラもQuaryzを採用しております。

Liferayの中でやり方を簡単にまとめます。

QuartzのCron設定フォーマット

出典:http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html

QuartzのCron設定サンプル

出典:http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html

Liferayのバッチ実装必要なメソッド

  • activate:OSGiモジュール起動処理
  • deactivate:OSGiモジュール停止処理
  • receive:ビジネスロジック

サンプル

TestBatch.java
package com.test.batch;

import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.messaging.DestinationNames;
import com.liferay.portal.kernel.messaging.Message;
import com.liferay.portal.kernel.messaging.MessageListener;
import com.liferay.portal.kernel.messaging.MessageListenerException;
import com.liferay.portal.kernel.scheduler.SchedulerEngineHelper;
import com.liferay.portal.kernel.scheduler.SchedulerEntryImpl;
import com.liferay.portal.kernel.scheduler.TimeUnit;
import com.liferay.portal.kernel.scheduler.Trigger;
import com.liferay.portal.kernel.scheduler.TriggerFactoryUtil;

import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Modified;
import org.osgi.service.component.annotations.Reference;

@Component(immediate = true, property = {
}, service =TestBatch.class)
public class TestBatch implements MessageListener {

    private static Log _log = LogFactoryUtil.getLog(TestBatch.class);

    // バッチ起動間隔
    private static int INTERVAL_TIME = 15;

    @Override
    public void receive(Message message) throws MessageListenerException {

        _log.info("バッチ 開始");

        // do something

        _log.info("バッチ 終了");
    }

    @Activate
    @Modified
    protected void activate() {
        String batchClassName = this.getClass().getName();
        // トリガーの設定
        Trigger trigger = TriggerFactoryUtil.createTrigger(batchClassName, batchClassName, INTERVAL_TIME, TimeUnit.MINUTE);
        SchedulerEntryImpl schedulerEntryImpl = new SchedulerEntryImpl(batchClassName, trigger);

        _schedulerEngineHelper.register(this, schedulerEntryImpl, DestinationNames.SCHEDULER_DISPATCH);

        _log.info("Batch is activated.");
    }

    @Deactivate
    protected void deactivate() {
        _schedulerEngineHelper.unregister(this);
    }

    @Reference(unbind = "-")
    private volatile SchedulerEngineHelper _schedulerEngineHelper;

}

ポイントとなるトリガーの作成


TriggerFactoryUtilクラスに用意されていますので、簡単に作成できます。

CronTrigger: http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html
参考記事:https://portal.liferay.dev/docs/7-1/tutorials/-/knowledge_base/t/message-listeners

以上