JBoss上のアプリケーションへのアクセスを検知する新しい方法を開発しましたよ
※ネタです
例えばJBoss上で、ウェブアプリにアクセスがあったかどうか確認するには、まあログとか監視ツールを見ると思うのですが、もっと直感的な方法を考案しました!
アクセスランプです!
ソースはこちら!AccessLampValve
以上です…で終わってもいいんですが、せっかくなのでもう少し説明します。
まずこれは、Raspberry Pi上だけで動作します。次に、Tomcat / JBossWebにはValveという仕組みがあります。アクセスログなどはこの仕組みを使って記録できるわけですが、それと同じようにアクセスがあるとLEDを光らせる、AccessLampValve.javaを作りました。大事な点はわずか2行で、Valve#invokeの実装に、pin.high() と pin.low() を追加しただけです。
public void invoke(Request request, Response response) throws IOException, ServletException { if (started) { pin.high(); getNext().invoke(request, response); pin.low(); } else { getNext().invoke(request, response); } }
pin変数の型は、Pi4J 0.0.5のcom.pi4j.io.gpio.Pinです。ということでPi4Jを使っています。Pi4JはさらにWiringPiライブラリに依存しているので、WiringPiのインストールも必要です。
今回は、特定のアプリケーションにアクセスするとこのバルブが有効になるようにjboss-web.xmlを設定しています。下のpinNumberは、実際に配線に使うGPIOのピン番号を示しているので、これを変えれば別のピンに配線もできます。また、AccessLampValveではピンのHIGH/LOWを切り替えているだけなので、配線次第ではLEDではなくスピーカーにしたり旗を振る人形だったりに変更できて夢が広がります*1。
<jboss-web> <context-root>alv</context-root> <valve> <class-name>net.seannos.valve.access.lamp.AccessLampValve</class-name> <param> <param-name>pinNumber</param-name> <!-- this value should be from com.pi4j.io.gpio.RaspiPin.GPIO_00 to com.pi4j.io.gpio.RaspiPin.GPIO_20 --> <param-value>com.pi4j.io.gpio.RaspiPin.GPIO_05</param-value> </param> </valve> </jboss-web>
なお、今回のプロジェクトはたまたまJBoss EAPのJARファイルを指定しちゃったので、ビルドにはJBoss Enterprise Maven Repositoryへの参照が必要ですが、簡単な構成なのでコミュニティ版へもすぐに変更できます。気が向けばやっときます*2。
さて、mvn packageでビルドして target/AccessLampValve-0.0.1.war を$JBOSS_HOME/standalone/deployment/ にコピーして、JBossを起動します。
それからブラウザで、写真では緑のケースの方の /alv/index.jsp にアクセスすると、緑のLEDが光ります。同様に赤いケースの方は、最初の写真のように赤いLEDが光ります。
ついでに、この2台はクラスタ構成となっていて、手元のFedoraにhttpdを立てて、mod_jk 経由でロードバランシングしています。なのでFedora上で、localhost/alv/count.jspにアクセスすると、緑か赤のノードにつながるのですが、この時もLEDを見ていると、緑ノードであることがすぐに分かります!便利ですね。
まあログからも確認しつつ、緑ノードのJBossを落とすと、こんどは赤ノードにつながることがLEDで確認できます!*3
このように、非常に直感的にノードへのアクセスを確認できました。
最後に注意事項ですが、Raspberry Piでしか動作せず、しかもGPIOのアクセス権限のため、root権限でJBossを起動する必要があります*4。ということで運用上お勧めできるものではないので、あくまでネタとしてお楽しみください :-P