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台はクラスタ構成となっていて、手元のFedorahttpdを立てて、mod_jk 経由でロードバランシングしています。なのでFedora上で、localhost/alv/count.jspにアクセスすると、緑か赤のノードにつながるのですが、この時もLEDを見ていると、緑ノードであることがすぐに分かります!便利ですね。


 


まあログからも確認しつつ、緑ノードのJBossを落とすと、こんどは赤ノードにつながることがLEDで確認できます!*3


 


このように、非常に直感的にノードへのアクセスを確認できました。


最後に注意事項ですが、Raspberry Piでしか動作せず、しかもGPIOのアクセス権限のため、root権限でJBossを起動する必要があります*4。ということで運用上お勧めできるものではないので、あくまでネタとしてお楽しみください :-P

*1:このコードでは一瞬で切り替わるので、もうちょっとマシなコードにする必要がありますが

*2:ビルドまでは簡単なんだけど、もう一回配線しなおして実際に試すのがちょっと面倒

*3:セッションは維持されています

*4:JBossのroot権限での起動は非推奨です!