[Java]定期的に処理をさせる

これまでJavaでバッチを作成して、Javaのバッチを起動するシェルスクリプトをcronから起動するなんて事をやっていたのですが、JavaVMを常時起動させてもっと短い間隔で処理をしたいと思っていました。


追記:
java.util.Timerクラスで全く同じことができるようです。知らなかった。。


やろうとしたこと

・10秒に1回処理をしたい
・多重に起動したくない(簡単なら処理終了から10秒経過したタイミングで再度実行したい)

昔に組んだシステムではcronで5分毎にJavaのバッチを起動し、さらにJavaのバッチ側で特定のポートのListenを試行して、多重起動を防止していました。
この実装では処理終了から5分ではなく、5分に1回動こうとしているため、バッチが6分かかった場合などに4分間隙間が空いていました。
それを防ごうと機能を追加していった結果アプリケーションの動作フロー全体がスパゲティになっていた。。閑話休題。

ScheduledExecutorService

探していたら目的にぴったりの標準APIがありました。

こんな感じ。
このAPIが追加されたのは1.5のようですが、上のサンプルコードではラムダ式を使っているのでJava8の必要があります。

サンプルコード中で使用しているscheduleWithFixedDelayメソッドを使用すると、実行後からの時間を指定できます。
scheduleAtFixedRateメソッドにすると実行時間に関係なく可能な限り指定時間ごとに呼び出されるようです。こちらは多重起動もありえるみたい。
今回のコードではnewSingleThreadScheduledExecutor()でScheduledExecutorServiceを作成しているので、多重起動は起こりません。

単発で時間指定して処理を走らせることもできる。詳しくはJavadoc参照。

mainメソッドが終わってもScheduledExecutorServiceが生きているとVMのプロセスは死なないので注意してください。

確かめてみるとこんな感じ。
・ScheduledExecutorServiceがnewされて、何もscheduleしていないとプロセスは止まる。
・何かscheduleした場合はfutureのcancelだけではプロセスは生き残る。
・shutdownしたらプロセスは止まる。

おまけ:cronもどきのライブラリ

実はcronで秒まで指定できないのを失念していたので色々探してしまった。
ただ、曜日や毎時10分と15分、などといった複雑な条件を指定したければライブラリを使うしかなさそうなので機会があれば使うかも。

・cron4j
cronとして使うにはシンプルだったが、秒単位での動作はできなかった(当たり前)。

・quartz
簡単には使えそうになかったので確かめなかった。

カテゴリー: Java, プログラミング関連 | コメントする

LINE Bot APIを試してみた

ローカルの開発環境からメッセージを送信するところまで試してみた。
Javaで呼び出したコードが全然ヒットしなかったので雑だけど公開してみる。

続きを読む

カテゴリー: Java, Web関連, サーバ関連 | 1件のコメント

TrueTypeFontのファイルフォーマット調べ書き

なんとなく調べてみました。
日本語のまとまった文献がほとんどなくてしんどかった。

続きを読む

カテゴリー: プログラミング関連 | コメントする

[ツール]BFNT+ファイル→PNG変換

PC98でmaster libに頼った時にお世話になった*.bftという画像ファイル。

調べてみるとBFNT+フォーマットというらしい。残念ながら時代の流れで消えていってしまったのか、検索しても最近の日本語のページは全然ヒットしませんでした。

昔のフロッピーから発見したBFTファイルを掘り出したのですが、見れるソフトがなかったためPNGに起こすツールを作りました。もしかすると他に使う人がいるかもしれませんので公開しておきます。需要なさそうだし汎用性なくて(※後述)実用に耐えるか不明ですが。

このプログラムを使用したことによる損失に関しては一切の責任を負えませんので、自己責任でお使いください。

BFTConv.zip

BFNT+の形式で保存されている、現存するファイル自体がレアな代物だと思います。自分の手元には1つしかなかったので、このプログラムはそれ専用に組んでいます。

具体的にはサイズ32×32で色数16,画像数64固定になっています。

この条件以外の画像に使用したい場合は、ソースを添付してあるので改造してみてください。

サイズや画像数は定数で指定してあるだけなので書き換えるだけで通ると思いますが、色数が変わると1ピクセルごとの情報を格納する方法が変わるため頑張る必要がありそうです。

カテゴリー: Java, プログラミング関連 | コメントする

【Java】リフレクションの高速化手法-改訂版

メソッド名やその引数が可変な状況でのリフレクションは非常にパフォーマンスが悪いです。その処理をネイティブでの呼び出しと同レベルまで引き上げるのが今回のお題です。

続きを読む

カテゴリー: Java, プログラミング関連 | 1件のコメント

[JSP]continueを使ったらコンパイルエラーになる時の対処

本当に自分用メモなので最小限。

JSPを書くときは可読性をすこしでも上げようとしてifやforの閉じ括弧は行の初めに書いているのですが、以下の記述でコンパイルエラーが発生しました。

なぜコンパイルエラーになったかというと、continue;の後に改行を打ち出す処理が付け加えられて到達不可能なコードが生成されていた模様。

こうやると正しくコンパイルできた。

カテゴリー: Java, プログラミング関連 | コメントする

Twitter連携アプリの権限について

あらすじ

先日、「ツイート数カウントくん」というTwitter連携アプリを認証していた12万アカウントから一斉にブロック・フォロー処理が実行される事件がありました。

続きを読む

カテゴリー: サービス関係のお知らせ | タグ: | コメントする

[C#]他プロセスのコマンドライン引数を取得

ダメ元で探したら、Win32_Processから取れるよ、というヒントを見つけた。

Win32_Processってどう使うんだ? と悩んでいたらここにたどり着きました。

さすがにこれだけでは寂しいので、サンプルコード書いたものを続きを読むの中に置いておきます。上記サイトを参考に組ませて頂きました。

続きを読む

カテゴリー: C#, プログラミング関連 | コメントする

simutransのサーバーをCentOSに建てるメモ

流れ

この頃simutransというフリーゲーム落として、箱庭っぽくのんびり眺めているのですが、どうせなら昼夜問わず動かし続けた方が箱庭なんじゃないか?と思いサーバーを建てた。

続きを読む

カテゴリー: サーバ関連, 日記的な物 | コメントする

[Java]ImageIO.write呼び出しでのIndexOutOfBoundsExceptionスロー

ImageIO.writeというと、BufferedImageなどをpngなどに変換する場合によく用いますが、そこでIndexOutOfBoundsExceptionとかいうのがスローされていて原因がさっぱりだったので調べた結果。

まずはググってみた。「ImageIO.write IndexOutOfBoundsException」とか。

海外のフォーラムで「バグっぽいね!ImageIOに渡す第三引数をMemoryCacheImageOutputStreamで包んでやればいいよ!」とかいう記述を見た。

サンプルコード:

で変更して再実験、確かにExceptionは出ない。だけど望む処理ができてない。MemoryCacheImageOutputStreamに関しては探しても日本語の情報出てきそうになかったのでとりあえず気にしないことにして元に戻したりしていた。(javax.imageio.stream以下のそんなもの聞いたこともなかったので)

~(30分経過)~

アレ?Exceptionは見つからない…?

というわけでお見事OutOfMemoryErrorさんが釣れました。

普段メモリーの事気にしないとExceptionで全部取れる気がしてしまうけど、デバッグ時には何でもひっ捕らえるようにしよう…

カテゴリー: Java, プログラミング関連 | コメントする