JavaEE & GlassFish勉強会に行ってきました

Java EE 7 & GlassFish について語ろう - DevLOVE関西 | Doorkeeperに行ってきました。

GlassFish v1からの歴史のお話、v4が2013年6月12日にリリース、ブログに詳細が書かれていましたJava EE 7 ローンチ (US 時間: 06/12 午前9時) | 寺田 佳央 - Yoshio Terada
GlassFish v3では、開発者が以前のバーションよりさらにレベルの高い技術者に入れ替わったことにより内部実装が刷新されたそうです。
特にOSGI対応でより柔軟になったことや、OSGIカスタムモジュール作成が可能になったそうです!OSGi | 寺田 佳央 - Yoshio Terada
OSGIはちょっと興味があるので試してみます。
後は、WebSocket、JavaEE7ではJMS送信が簡単に、JavaEE8ではcloud対応、JavaEE7では並列処理が可能に(ダイナミックプロキシ)など盛りだくさんでとても楽しかったです。
そうそう、GlassFishの画面はJSFで作成されているそうです。
GlassFish関連情報が寺田さんのブログGlassFish 関連 | 寺田 佳央 - Yoshio Teradaにありました、とても参考になります!

JAX-RSDoma Doma - Domaプロジェクトへようこそ、Viewはjersey-mvc Chapter 20. MVC Templates
GlassFishではasadminコマンドでdeploy時にバージョンを指定できるなど、実際に開発で使用した経験によるお話ですごく納得できるお話でした。
ブログJAX-RSとかの話 — 裏紙にも書かれています。以前に写経して勉強させていただきました!

@さんも参加、JSF、PrimeFacesなどのお話で盛り上がりました。
実際にJavaEEで開発するには各コンポーネントごとに一人は熟練した人が必要とか開発現場でのお話もありました。
きしださんのブログJava8 Lambdaの文法拡張まとめ - きしだのはてななどもよく写経して勉強させていただいてます。

折角勉強会に参加したのでこれを機にちょっとGlassFishOSGIを触ってみました。もちろん寺田さんのブログを参考にさせていただきました。
そもそもOSGIがまずよくわかっていないので、、、いつも通り時間が掛かって、手順をメモメモ、
まずGlassFishで使われているApache Felixを試してみました。ドキュメントはここですApache Felix - Apache Felix Framework Usage Documentation
1. Download
2. カスタムモジュール作成(Activator.java)

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;

public class Activator implements BundleActivator, ServiceListener {
    @Override
    public void start(BundleContext bc) throws Exception {
        System.out.println("Started the OSGI example Bundle"); // ***このメッセージが後で表示される
        bc.addServiceListener(this);
    }
    @Override
    public void stop(BundleContext bc) throws Exception {
        bc.removeServiceListener(this);
        System.out.println("Stopped the OSGI example Bundle"); // ***このメッセージが後で表示される
    }
    @Override
    public void serviceChanged(ServiceEvent event) {
        String[] objCls = (String[]) event.getServiceReference().getProperty("objectClass");
        if (event.getType() == ServiceEvent.REGISTERED) {
            System.out.println("Ex1:Service of type" + objCls[0] + " registered.");
        } else if (event.getType() == ServiceEvent.UNREGISTERING) {
            System.out.println("Ex1:Servce of type " + objCls[0] + " nnregistered.");
        } else if (event.getType() == ServiceEvent.MODIFIED) {
            System.out.println("Ex1:Service of type " + objCls[0] + " modified.");
        }
    }
}

3. manifest.mf
Bundle-Activatorで上記にある作成したActivator.javaを指定
Bundle-nameにService listener exampleを指定

Main-Class: Activator
Class-Path: Users/tomo/Download/felix-framework-4.2.1/bin/felix.jar
Bundle-Name: Service listner example
Bundle-Description: A bundle that displays message
Bundle-Vendor: Apache Felix
Bundle-Version: 1.0.0
Bundle-Activator: Activator
Import-Package: org.osgi.framework

4. コンパイル、jar作成(example.jar)
上記1のActivator.javaコンパイルして、2のmanifest.mfを使ってjar作成

5. Felix起動
downloadしたdirectoryに移動して以下のコマンド実行

java -jar bin/felix.jar

6. 4で作成したexampleモジュールの開始、停止

felix:install file:/Users/tomo/BundleSample/example.jar

でBundle ID が表示されるのでこのID[13]を使って開始

felix:start 13

同様に停止も[13]を指定

felix:stop 13

こんな感じで、Activator.javaで実装したメッセージが表示されるの確認

7. 最後にFelix自体を停止、ID[0]を指定

felix:stop 0

8. 上記でテストしたexampleモジュール(example.jar)をGlassFishの「modules」配下にコピー

cp BundleSample/example.jar ~/Downloads/glassfish4/glassfish/modules/

9. GlassFishの起動
まずPATHを設定してから
NetBeansでWebApplicationを作成して起動していたのでパスが未設定のため、asadminコマンドがエラーになりました)

asadminコマンドでGlassFishを起動

asadmin start-domain domain1

10. 6666ボートにアクセス

 telnet localhost 6666


ここでエラー発生、GlassFish v4では製品版の初期設定として接続できないようになっているようです。
OSGIのドキュメントを読んでみるとv4からは6666に接続しなくても、OSGIコマンドがasadminに追加されていました。
で「asadmin osgi lb」でバンドルモジュール一覧が表示されます。ますます使いやすくなっているんですね。
詳細はここOSGI-Featuresにあります。

asadmin osgi lb | grep example

作成したモジュール(example.jar)のbundle-nameである「Service listner example」が表示

11.上記でテストしたexampleモジュール(example.jar)を開始、停止
表示されたID[295]を指定してモジュールを開始、停止

asadmin osgi start 295
asadmin osgi stop 295

ここでもexampleモジュール(Activator.java)で実装したメッセージが表示されることが確認できました。

何とか、モジュールを作成してGlassFish上で動作することが確認できました。汗、、、

最後に

毎回本当に勉強になります!
スタッフ、スピーカー、参加者の方々に感謝です!