NetBeansとGlassFishを使ってJavaEE7のWebSocketを遊ぶ。あとAWSでデプロイとか。
ちょっと前になりますが、最新のJavaEE7がリリースされました。
さらにJavaEE7に対応したNetBeansとGlassFishも出たということなので、WebSocketの実験です。
ローカルで動作確認ができたら、AWSのEC2で動かしてみます。
ローカル環境構築
NetBeansとGlassFishのインストール
まずはJavaEE7に対応したNetBeans7.3.1のダウンロードから。
https://netbeans.org/downloads/
"JavaEE"でいいやと思ったけど、サイズたいして変わらないので"すべて"をダウンロードして netbeans-7.3.1-windows.exe を実行。
※JDKがインストールされていないとエラーが出るので、事前にインストールしておきます。
プロジェクトの作成
デスクトップにできた NetBeans IDE 7.3.1 をクリックして起動します。
「ファイル」-「新規プロジェクト」でダイアログを開き、「Java Web」からWebアプリケーションを選択します。
プロジェクト名は「JavaEE7Test」としておきます。
JavaEEバージョンが7になっているのを確認したらそのまま「次へ」。
とりあえず今回はフレームワークは何も選択せずに終了。
サーバーアプリケーションの作成
プロジェクトのソース・パッケージを右クリックして 「新規」-「その他」を選択。
Webカテゴリから「WebSocketエンドポイント」を選択して「次へ」。
パッケージ名だけ適当に入力して「終了」。
作成されたクラスに以下の処理を記述。
@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サーバーを起動して確認
プロジェクト名を右クリックして「実行」
サーバーが起動すると自動的に index.html のページを開きますが、
開かれない場合はブラウザから
http://localhost:8080/JavaEE7Test/
にアクセスします。
ためしにChromeとIEでアクセスして、IEからメッセージを送信してみます。
ちゃんとChromeとIEの両方にメッセージが表示されました!
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を許可しておきます。
ポート8000でアクセスすると、GlassFishの画面が表示されました。
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.
プロジェクトを右クリックして「消去してビルド」を選択。
ファイルのタブでdestフォルダを見るとwarファイルが作成されています。
これを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.
サーバーが起動したら、先ほどと同様にブラウザからアクセスしてみます。
キター!
この記事をアップしてしばらくはここで動かしておくので、気が向いたら遊んでみてください。別に面白くはないですがw
ただし、送信したメッセージは同時接続している他の人にも送られるので、常識の範囲でおねがいします。
- 作者: 相生拓未
- 出版社/メーカー: 秀和システム
- 発売日: 2010/08
- メディア: 単行本
- 購入: 1人 クリック: 23回
- この商品を含むブログ (4件) を見る
Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava (Programmer’s SELECTION)
- 作者: Antonio Goncalves,日本オラクル株式会社,株式会社プロシステムエルオーシー
- 出版社/メーカー: 翔泳社
- 発売日: 2012/03/09
- メディア: 大型本
- 購入: 5人 クリック: 147回
- この商品を含むブログ (24件) を見る