Help us understand the problem. What is going on with this article?

Playでバッチ処理をpluginで実装する

More than 3 years have passed since last update.

きっかけ

バッチなど、バックグラウンドの処理をAkkaでスケジュールに登録した形で実装するのがplayでよくあると思います。そういった処理は、開発中やテスト中は止めておきたく、on/offを簡単にできるようにしたくなります。

そこで、playのplugin機能を使います。2.4からmoduleとなっていますが、pluginの方がわかりやすい面もあるのと、今使っているplayのバージョンが古いので、それで紹介してみます。

play.Pluginの実装

自前のpluginをつくるにはplay.Pluginを実装します。

BatchPlugin.java
import play.Application;
import play.Configuration;
import play.Plugin;

public class BatchPlugin extends Plugin {

    private Logger logger;

    private Configuration conf;

   public BatchPlugin (Application app) {
       this.logger = LoggerFactory.getLogger(BatchPlugin.class);
       this.configuration = app.configuration();
   }

   /**
    * プラグインが有効かの判定.
    */ 
   @Override
   public boolean enabled() {
        return !"disabled".equals(conf.getString("batchPlugin"));
   }

   /**
     * アプリ起動時の処理.
     */
    @Override
    public void onStart() {
        logger.info("start batch");

        ActorRef actorRef =  Akka.system().actorOf(Props.create(BatchActor.class));
        Akka.system().scheduler().schedule(
                        FiniteDuration.Zero,
                        FiniteDuration.create(1, TimeUnit.DAYS),
                        actorRef,
                        "batch",
                        Akka.system().dispatcher(),
                        ActorRef.noSender());

    }

    /**
     * アプリ停止時の処理
     */
    @Override
    public void onStop() {
        logger.info("stop batch");
    }


}

play.Applicationだけを引数とするコンストラクタの定義と、enabled(),onStart(),onStop()を実装すればよいです。

enabled()の実装は、evolutionsと同じです。これでapplication.confにbatchPlugin=disabledを追記すれば、Akkaでのスケジュール登録を止められます。

ActorRefのインスタンス生成はコンストラクタでやろうと思ったのですが、play.Akka.system()がそのタイミングでは起動していないようです。onStartでやらないと無限ループしました...

まとめ

公式サイトにありますが、plugin機能は、他のアプリでも再利用できるようにするよりも、ひとつのアプリで内部的に使うのにも便利です。本番環境のときで動いて欲しいなど、特定のケースのみの機能はpluginに切り出すと、コード的にも運用的にも管理しやすくなります。

2.4からDIで、moduleを注入するやり方がよいでしょう。play.modules.enabledplay.modules.disabledで、moduleを使うかどうかをコントロールできます。

pluginからmoduleへの移行方法も公式で用意されています。

参考サイト

https://www.playframework.com/documentation/2.3.x/JavaPlugins

http://d.hatena.ne.jp/kamekoopa/20130306/1362561242

http://tototoshi.hatenablog.com/entry/2014/12/14/170745

n_slender
一応Javaエンジニアです。仕事の関係でPHP、Python、Rubyをやることも。開発環境を構築することもあるので、そのレベルでのインフラネタもたまに。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした