2017/08/04 (Fri)
Guice + Quartz Scheduler + Jetty で定時起動アプリケーション
2年前位、Google Guice + Quartz Schedulerで定時起動アプリのサンプルを書いたんですけど*1 久々GitHubを見たら、星が何個か付いている!!!*2 まぁ、Guice/Quartzと言う組み合わせ自体、ちょっとレア過ぎて、他に例が無かったからかもしれませんけど…。
当時は、WARを作って、それをTomcatとかのコンテナに放り込む、と言うのは普通だったんですけど、今は組み込みコンテナを使って、FatJARで自立/自走するのが主流ですよね。
という事なので、Embedding Jettyを使って、設定ファイル無しスタイル*3 *4 で、もう一個サンプルプログラムを書いてみました。
まぁ、メインは殆ど QuartzModule クラスで、ここで JobFactory / SchedulerFactory / Scheduler の設定と発火を行っているので、そこを参照して頂ければ、ほぼオッケーでしょうか。 Job クラスも Guice コンテナ管理下にあるんで、必要に応じて、AOPやトランザクション管理とか書いてみても良いでしょう。
でも、 Quartz Scheduler もヴァージョンが上がって、いつの間にか、殆ど Builder Pattern/Fluent Interface*5で設定出来るようになったんだ…、とオモシロでしたね。
*1: Guice + Quartz Scheduler で定時起動アプリケーション - ひとり開発日記。 - プログラマの秘密のあれこれ
*3:所謂 The Twelve-Factor App スタイル https://12factor.net/ja/
*4:Heroku https://www.heroku.com/ で動かすことを想定しています
2017/06/24 (Sat)
jax-rs-pac4j 2.0.1
java |
Pac4Jと言う、Javaベースのウェブアプリの認証をサポートしてくれる、ライブラリ群があります。*1 jax-rs-pac4jは、JAX-RSに特化したライブラリで、今回、私が報告したバグ修正2件の入った、2.0.1がリリースされました。
- Grizzly+Jersey+jax-rs-pac4jでNullPointerException
- 自分で、今、The Twelve-Factor App*2ベースのウェブアプリを作ろうと思っていて、フレームワークは、Jersey MVC*3で、認証はtwitter*4、認証機構には何がいいかな、とググっていたらJAX-RSに特化した、jax-rs-pac4jがあることを知りました。
- で、早速、推奨構成の Grizzly + Jersey MVC + pac4j-oath + jax-rs-pac4j で、プロジェクトを作成し、認証までは軽く通ったんですが、なぜかコールバックで NullPointerException(NPE) 発生…。 よく分からないので、スタックから追っていくと、pac4jのコールバック処理で、セッションの要素を消すのに、nullを書き込んでいて、Grizzlyの中のインメモリ・セッションキャッシュは ConcurrentHashMap を使っているので、null値をputすると、当然、NPEが出てしまうのです。
- ユーザーフォーラムで報告したら、GitHubにイシュー立てろ、って言われて、立てたら、"Good find.(よう見つけたな)"ってレスされて、ちょっとイラってしましたけどね…。 まぁ、速攻で直して貰ったのでありがたいですわ。
- issueに書いてある回避策を試したらNullPointerException
- issueに書いてある回避策を参考に、GrizzlySessionStore をラップしたサブクラスを作って、configに追加したら、あれ、認証前に例外発生。 しょうがないんで、またスタックから追っていくと、SessionStoreの有無判定で、三項演算子でnullチェックしてるのに、nullを再代入してる…。 これはNPE不可避ですなぁ。
- あんまりにも致命的なバグなので、イシューもプルリクも無しで、コミットして、緊急リリースしてくれましたね。
ライブラリ群の中でも再後発、先月リリースの大きく書き直した2.0.0、しかもバグ回避ルートと言う事情なので、仕方ないかもですが、無償でデバッグしてるようで、モニョモニョと…。
とは言え、OSSとはそんなもんで、市井のプログラマーが、協力しあって育てていくものなのかもしれませんね。
*1:http://takezoe.hatenablog.com/entry/2017/01/28/021818 pac4jでGitHubのOAuth認証を使ってみる - たけぞう瀕死ブログ
*3:https://jersey.github.io/documentation/latest/mvc.html
*4:ありがち…
2017/06/02 (Fri)
Windowsのcmd.exeで、Mavenを使って新規プロジェクトを作る時
mvn archetype:generate ^ -DarchetypeArtifactId=maven-archetype-quickstart ^ -DinteractiveMode=false ^ -DgroupId=net.halflite ^ -DartifactId=testapp ^ -Dpackage=net.halflite.testapp
*1:cmdのバッチファイルで、1コマンドを複数行にわたって記述したい場合 http://qiita.com/ndxbn/items/089b97e33ae9b69bf48b
*2:groupId/artifactId/package は適時書き換えて下さいな
2017/03/31 (Fri)
Windowsマシンにnode.jsをインストール
nodejs |
nodistを使えば、node.jsのバージョン切り替えも簡単ですよ、と。
毎度毎度、やり方忘れてググってしまうので、自分のブログにメモ代わりに書きます。
nodistのインストール
- 公式サイトのリリースページからダウンロード、インストールします。
- バージョン確認
> nodist -v
node.jsのインストール
- 使えるnode.jsのバージョンを確認する
> nodist dist
- 目的のバージョンのnode.jsを入れる
> nodist + 9.9.0 > nodist use 9.9.0
- node.jsのバージョンを確認
> node -v
npmのアップデート
> nodist npm 5.0.1 > npm -v
2017/02/11 (Sat)
今週の月曜日
java |
「2017/01/01は日曜日なので、"今週の月曜日"なら2017/01/02になりますよ」ってコメントしようと思ったのですが、どうにもこうにもクソリプっぽかったので、自分の日記に書きます。
解決策として、「今日が日曜日なら本日、そうでないなら前の日曜日に戻る」→「次の月曜日を求める」で、2017/01/01週の月曜日を求めると、Java8だと、日時APIを使用して、以下のようにするのがいいのですかね。
package test; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import java.time.DayOfWeek; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import org.junit.Test; public class ThisMondayTest { @Test public void testThisMonday() { String date = ZonedDateTime.of(2017, 1, 1, 0, 0, 0, 0, ZoneId.of("Asia/Tokyo")) .with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY)) .with(TemporalAdjusters.next(DayOfWeek.MONDAY)) .format(DateTimeFormatter.ISO_LOCAL_DATE); assertThat(date, is("2017-01-02")); } }