あるコードを定期実行したい
サーバーの状況を定期的に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にすると、非同期実行してくれるみたい。
なんかルールがあるみたいですが、まぁ今はどうでもいいや。
おわりに
いい感じに実装できたので、後々わかったことがあれば追記します。
参考文献