Spigotプラグインに定期実行処理を実装する

あるコードを定期実行したい

サーバーの状況を定期的にPOSTするソースコードを書きたい。

threadでsleepして待つ方法(以下)なども考えたけど、そうじゃない感じがするので調べてみた。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class Main: JavaPlugin() {

    override fun onEnable() {
        // Thread にさせる処理を記述
        val thread = Thread {
            try {
                val count = 0
                while(count < 10) {
                    Thread.sleep(2000)
                    println("Loop Count: $count")
                    count++
                }
            } catch(e: InterruptedException) {
                e.printStackTrace()
            }
        }

        // Thread 処理実行
        thread.start()
    }
}

どうやらスケジューラがあるらしい。

調べた感じいくつか方法があるみたいだけど、簡単なほうを実装しよう。

スケジューラを作成する

スケジューラを実装するためにはBukkitRunnableを継承すればいいらしい。

それっぽいクラスを作ってみる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class SampleScheduler: BukkitRunnable() {

    var count = 0

    override fun run() {
        // ここに処理を書く

        println("Count: $count")
        count++

    }
}

クラスを呼び出す

BukkitRunnableを継承したクラスを作成するだけではだめなんで、どこかのタイミングで呼び出す必要がある。

今回の場合であれば、特に指定はないので適当に起動したタイミングで呼び出そう。

1
2
3
4
5
6
7
8
9
class Main: JavaPlugin() {

    override fun onEnable() {

        // スケジューラを登録
        SampleScheduler().runTaskTimer(this, 0L, 40L) // 2秒に一回実行

    }
}

こんな感じでクラスを呼び出せばおしまい。

runTaskTimerに渡してる引数は第一引数にプラグイン自体のインスタンス、次に遅延実行するTick数、最後に定期実行するTick数だそうです。

一秒20Tickなので40Tickは2秒です。(トートロジー)

ちなみにこれにAsynchronouslyをつけてrunTaskTimerAsynchronouslyにすると、非同期実行してくれるみたい。

なんかルールがあるみたいですが、まぁ今はどうでもいいや。

おわりに

いい感じに実装できたので、後々わかったことがあれば追記します。

参考文献