nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

Java EE Application Client

Java EEでは.earファイル、.warファイル、.jarファイルなどのアーカイブがあります。マイナーどころでは.rarというのもあります。今日紹介するのはそのなかでも抜群にマイナーであろう.carファイル、Java EE Application Clientです。

Java EE Application Clientを利用するとリモートクライアントからのEJB呼び出しとかJMS呼び出しとかJNDI呼び出しが簡単にできるようになります。

昨日のJavaFX勉強会でApplication Clientを使うというネタをよっしーがやってたっぽいので、JBoss AS7でもやってみます。JavaFXは抜きです。しかしApplication Client見かけるの久しぶりすぎる。

利用したEARはGitHubに置いてあります。

まずは普通にStateless Session Beanを作ります。インターフェース定義とかは掲載省略。リモートクライアントからのアクセスなので@Remoteで。

@Remote
@Stateless
public class HelloSLSB implements Hello {
    public String hello() {
        System.out.println("Hello World!");
    }
}

クライアントを作ります。インジェクションするだけ。

public class HelloClient {
    @EJB
    static Hello hello;
    public static void main(String[] args) throws Exception {
        hello.hello();
    }
}

EARは$JBOSS_HOME/standalone/deployments/にデプロイしてJBoss AS7を起動しておきます。

アプリケーションクライアントの起動はこんな感じ。実行するとJBoss AS7側、つまりサーバ側にHello Worldが出力されているはずです。

$ sh $JBOSS_HOME/bin/appclient.sh $JBOSS_HOME/standalone/deployments/as7-ear.ear#as7-ear-appclient-1.0.jar

ホスト名とかのオプションのデフォルトは--host remote://localhost:4447なので、別ホストとかの場合はこのオプションを渡せば良いです。

クライアント側にJava EEコンテナのランタイムが必要になること、EAR本体が必要になることの2点が少々ファットな感じではありますが楽ちんに使えます。

ちなみにApplication Clientアーカイブは現在は.carじゃなくて普通の.jarなので.carという拡張子は飲み屋でしか使えないどうでもいいネタ知識です。

まとめ

リモートEJB呼び出しとか面倒なので良い子のみんなはJAX-RS使いましょう。そちらのほうが設計もキレイになりますし保守性なども抜群に上がります。