NetBeansとGlassFishを使ってJavaEE7のWebSocketを遊ぶ。あとAWSでデプロイとか。

ちょっと前になりますが、最新のJavaEE7がリリースされました。
さらにJavaEE7に対応したNetBeansとGlassFishも出たということなので、WebSocketの実験です。
ローカルで動作確認ができたら、AWSのEC2で動かしてみます。

ローカル環境構築

NetBeansとGlassFishのインストール

まずはJavaEE7に対応したNetBeans7.3.1のダウンロードから。
https://netbeans.org/downloads/

f:id:yuji0316:20130714185208p:plain

"JavaEE"でいいやと思ったけど、サイズたいして変わらないので"すべて"をダウンロードして netbeans-7.3.1-windows.exe を実行。
※JDKがインストールされていないとエラーが出るので、事前にインストールしておきます。

プロジェクトの作成

デスクトップにできた NetBeans IDE 7.3.1 をクリックして起動します。

f:id:yuji0316:20130714185209p:plain

「ファイル」-「新規プロジェクト」でダイアログを開き、「Java Web」からWebアプリケーションを選択します。

f:id:yuji0316:20130714185210p:plain

プロジェクト名は「JavaEE7Test」としておきます。

f:id:yuji0316:20130714185211p:plain

JavaEEバージョンが7になっているのを確認したらそのまま「次へ」。

f:id:yuji0316:20130714185212p:plain

とりあえず今回はフレームワークは何も選択せずに終了。

f:id:yuji0316:20130714185213p:plain

サーバーアプリケーションの作成

プロジェクトのソース・パッケージを右クリックして 「新規」-「その他」を選択。

f:id:yuji0316:20130714185214p:plain

Webカテゴリから「WebSocketエンドポイント」を選択して「次へ」。

f:id:yuji0316:20130714185215p:plain

パッケージ名だけ適当に入力して「終了」。

f:id:yuji0316:20130714185216p:plain

作成されたクラスに以下の処理を記述。

@ServerEndpoint("/endpoint")
public class NewWSEndpoint {

    private static Set<Session> sessionSet
            = Collections.synchronizedSet(new HashSet<Session>());

    @OnOpen
    public void open(Session session){ sessionSet.add(session); }

    @OnClose
    public void close(Session session){ sessionSet.remove(session); }

    @OnMessage
    public void onMessage(String message) {
        for(Session session : sessionSet){
            session.getAsyncRemote().sendText(message);
        }
    }
}

クライアントアプリケーションの作成

プロジェクト作成に作られた index.html を以下のように修正します。

<!DOCTYPE html>
<html>
<head>
    <title>JavaEE7 WebSocket Test</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script type="text/javascript">
        var socket;
        $(document).ready(function(){
            socket = new WebSocket("ws://localhost:8080/JavaEE7Test/endpoint");

            socket.onmessage = function(message){
                $('#messages').append(message.data + "<br/>");
            }

            $('#send').click(function(){
                socket.send($('#message').val());
                $('#message').val('');
            })
        });
    </script>
</head>
<body>
    <input id="message" type="text">
    <button id="send">Send</button>
    <div id="messages"></div>
</body>
</html>

GlassFishサーバーを起動して確認

プロジェクト名を右クリックして「実行」

f:id:yuji0316:20130714185217p:plain

サーバーが起動すると自動的に index.html のページを開きますが、
開かれない場合はブラウザから
http://localhost:8080/JavaEE7Test/
にアクセスします。

ためしにChromeとIEでアクセスして、IEからメッセージを送信してみます。

f:id:yuji0316:20130714185218p:plain

ちゃんとChromeとIEの両方にメッセージが表示されました!

f:id:yuji0316:20130714185219p:plain

AWS環境構築

今作成したプロジェクトを、今度はAWSのEC2で動かしてみます。

JDK1.7のインストール

ここからJDK1.7をダウンロードしてきます。
直接wgetをすると、規約に同意してくださいというエラーHTMLが帰ってきてしまったので、一度ローカルPCに保存して、S3に上げてからwgetでEC2に持ってきました。

/usr/local の下に解凍し jdk1.7 という名前でアクセスできるようにしておきます。

$ ls -l /usr/local | grep jdk
lrwxrwxrwx 1 root root        11 Jul 14 08:26 jdk1.7 -> jdk1.7.0_25
drwxr-xr-x 8  500  143      4096 Jun  6 04:07 jdk1.7.0_25
-rw-r--r-- 1 root root  96316511 Jul 14 08:19 jdk-7u25-linux-x64.gz

GlassFishのインストール

まずはGlassFishをダウンロードして解凍します。ここでは /usr/loca に置きます。

$ cd /usr/local
$ sudo wget http://download.java.net/glassfish/4.0/release/glassfish-4.0-ml.zip
$ sudo unzip glassfish-4.0-ml.zip

デフォルトのポート番号が8080となっていますが、同じサーバーでTomcatが8080を使っているので、ここでは8000に変更します。 あと、8181のポートも開かれていますが、こちらはとりあえず無効にしておきます。

$ cd /usr/local/glassfish4/glassfish/domains/domain1/config
$ sudo vi domain.xml

変更前
<network-listener port="8080" protocol="http-listener-1" transport="tcp" name="http-listener-1" thread-pool="http-thread-pool"></network-listener>
<network-listener port="8181" protocol="http-listener-2" transport="tcp" name="http-listener-2" thread-pool="http-thread-pool"></network-listener>

変更後
<network-listener port="8000" protocol="http-listener-1" transport="tcp" name="http-listener-1" thread-pool="http-thread-pool"></network-listener>
<network-listener port="8181" enabled="false" protocol="http-listener-2" transport="tcp" name="http-listener-2" thread-pool="http-thread-pool"></network-listener>

設定が完了したらサーバーを起動します。
その際、rootユーザになった後、先ほどインストールしたJDK1.7を JAVA_HOME と AS_JAVA に設定します。

$ cd /usr/local/glassfish4/glassfish/bin
$ sudo su
# export JAVA_HOME=/usr/local/jdk1.7
# export AS_JAVA=/usr/local/jdk1.7
# ./asadmin start-domain
Waiting for domain1 to start .........................
Successfully started the domain : domain1
domain  Location: /usr/local/glassfish4/glassfish/domains/domain1
Log File: /usr/local/glassfish4/glassfish/domains/domain1/logs/server.log
Admin Port: 4848
Command start-domain executed successfully.

ブラウザからアクセスできるように、EC2のセキュリティグループで、ポート8000を許可しておきます。

f:id:yuji0316:20130714185220p:plain

ポート8000でアクセスすると、GlassFishの画面が表示されました。

f:id:yuji0316:20130714185221p:plain

WebSocketのプロジェクトを配置

先ほどNetBeansで作成したサーバーアプリケーションをwarファイルにして、AWSのGlassFishに配置します。

まずはGlassFishを停止。ユーザは先ほどrootになったので、そのまま実行。

# cd /usr/local/glassfish4/glassfish/bin
# ./asadmin stop-domain
Waiting for the domain to stop ...
Command stop-domain executed successfully.

プロジェクトを右クリックして「消去してビルド」を選択。

f:id:yuji0316:20130714185222p:plain

ファイルのタブでdestフォルダを見るとwarファイルが作成されています。

f:id:yuji0316:20130714185223p:plain

これをJDKの時と同じように、S3に上げてから、wgetでEC2に持ってきます。
自動デプロイ用のフォルダにwarファイルを配置したら、GlassFishを起動。

# cd /usr/local/glassfish4/glassfish/domains/domain1/autodeploy
# ls -l
total 12
drwxr-xr-x 2 root root 4096 May 14 22:34 bundles
-rw-r--r-- 1 root root 4164 Jul 14 09:01 JavaEE7Test.war
# cd /usr/local/glassfish4/glassfish/bin
# ./asadmin start-domain
Waiting for domain1 to start .................
Successfully started the domain : domain1
domain  Location: /usr/local/glassfish4/glassfish/domains/domain1
Log File: /usr/local/glassfish4/glassfish/domains/domain1/logs/server.log
Admin Port: 4848
Command start-domain executed successfully.

サーバーが起動したら、先ほどと同様にブラウザからアクセスしてみます。

f:id:yuji0316:20130714185224p:plain

キター!

この記事をアップしてしばらくはここで動かしておくので、気が向いたら遊んでみてください。別に面白くはないですがw
ただし、送信したメッセージは同時接続している他の人にも送られるので、常識の範囲でおねがいします。

作って覚えるJava―NetBeans入門

作って覚えるJava―NetBeans入門

Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava (Programmer’s SELECTION)

Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava (Programmer’s SELECTION)

  • 作者: Antonio Goncalves,日本オラクル株式会社,株式会社プロシステムエルオーシー
  • 出版社/メーカー: 翔泳社
  • 発売日: 2012/03/09
  • メディア: 大型本
  • 購入: 5人 クリック: 147回
  • この商品を含むブログ (24件) を見る