ラベル jetty の投稿を表示しています。 すべての投稿を表示
ラベル jetty の投稿を表示しています。 すべての投稿を表示

2013年2月16日土曜日

Jetty WebSocketを試してみてハマったこと

(※KK.Konさんにコメントによる指摘を頂いたので一部訂正しました 2013/03/02) 

 リアルタイム通信対戦を実現したくて,jetty-websocketを調べていた時にハマったアレコレ。

 参考にしたサイトは以下の通り。
eclipse jetty.project@github
RFC6455-The WebSocket Protocol 日本語訳
DENSO Smart Tech Award 2013#AndroidでSTAエミュレータを使用する
codehaus.org#Maven Jetty Plugin

 このエントリではサーバ・クライアント共にJavaで実装する。

 アプリケーションサーバにはJetty(v20121106)を使用する。JettyでWebSocketを扱っているブログ記事は多いのでコードに関する解説はry)

 クライアントサイドで使用するライブラリは何を使うのがいいか迷ったけど,サーバでJetty使うならクライアント側でもJettyのライブラリ使うのが現状では一番いいような希ガス。

 調べたライブラリは以下の通り。
jetty-websocket@github
TooTallNate/Java-WebSocket@github
rbaier/weberknecht@github

 今回はjetty-websocket使ったけど,もし他の使いたいならweberknechtよりはTooTallNate/java-WebSocketの方が良いかも。weberknechtはConnectionが開かなかった時に出るArrayIndexOutOfBoundsExceptionに対する処理を行なっていない。TooTallNateはこの例外処理を行なっている。

 ソースはgithubにおいてあります。(サーバサイドクライアントサイド
どちらもMaven使ってやりました。サーバ側はeclipse+WTPでもやってみたけど自分で突っ込むjarが多くて最初は戸惑う。少し試すだけならmaven使うのがいい。

 ハマったことは、

・TooTallNate・weberknechtとサーバjettyの相性
mavenにmvn jetty:stopでjettyを止めるようにする設定をpomに加えると動かなくなる
 (fixed 2013/03/02)
ていう2点 1点 (fixed 2013/03/02)。

 1点目はTooTallNateもしくはweberknechtをクライアント側で使う場合、jettyの8番台でmaven central repoにおいてある一番新しいv20121106では動かなかった(v20120910では動く)。詳しい原因はわからないが、jettyとJava-WebSocketで扱っているWebSocketのバージョンが違うのかなぁ・・・誰か詳しい人に教えてほちぃ。

 2点目はpom見てもらえば分かるんですけど、mavenコマンドからjettyサーバを止めるための設定をpomに加えると、これまたうまく動作しなくなります。これの原因もわかってない・・・ jetty止めるときはControl+Cで妥協しました。

 ちなみにmvn jetty:stopのためにpomに付け加えたのは以下のコメントアウト部分。
 pom.xmlのstopPortをserverPortと違うものにするとmvn jetty:stopのコマンドでjettyをストップできました。セキュリティの観点から?、jettyではコンテンツアクセスのポートとサーバ管理のアクセスポートを別にしているようです(ていうか通常はこのような実装?)。ポートに関して勉強不足でした。すいませんでした。
(fixed 2013/03/02)
(訂正前)

    org.mortbay.jetty
    jetty-maven-plugin
    ${jetty.version}
    
        
            /WebSocketServer
        
        
    
    

訂正後

    org.mortbay.jetty
    jetty-maven-plugin
    ${jetty.version}
    
        
            /WebSocketServer
        
        10
        hoge
        8090
    
    
        
            start-jetty
            pre-integration-test
            
                run
            
            
                0
                true
            
        
        
            stop-jetty
            post-integration-test
            
                stop
            
        
    

 以上がハマったアレコレでした。

 ちなみに実行してみた画面キャプチャは↓

2013年1月28日月曜日

CentOSにおけるjettyのdaemon化

以前のエントリ(CentOSにjettyを導入する)
の続き.

参考にしたサイトは
nobukatsu.jp#jettyのデーモン化
VINELINUX#chkconfigコマンドによる自動起動の設定
UNIX LINUX コマンド・シェルスクリプト リファレンス#if文とtestコマンド

では,早速

 /etc/init.d/以下にjettyファイルを作成する
$ sudo vim /etc/init.d/jetty
作成するファイルは以下の通り
↑のファイルの/usr/local/jettyの部分は自分の環境に合わせる.

 /etc/init.d/jettyに実行権限追加
$ sudo chmod 755 /etc/init.d/jetty
$ ls -l /etc/init.d/jetty
-rwxr-xr-x XXX XXXX XXXX 日付とか /etc/init.d/jetty
nobukatsu.jp#jettyのデーモン化 で紹介されているのと違う点は,bashコマンドが使えない環境でも,daemonが動く,という点.

作成したjettyファイル内の
if [ -z `/usr/bin/pgrep -f "java -jar start.jar"` ];
の部分だが,このバッククォート「`」でくくられている部分を,
if [ -z $(/usr/bin/pgrep -f "java -jar start.jar") ];
のように書くと,bashコマンドがデフォルトで使えないようなSolarisでは動かないという指摘を先輩エンジニアから受けました.
 bashコマンドがないような環境を使用しない人にとってはあまり関係のない話です.今回は古の技術を尊重してやってみました.

 ちなみに,Centでshとbashの関係を調べてみると,
$ ls -alF /bin/sh
/bin/sh -> bash*
という風になっていて,shにはbashのシンボリックが貼られていることがわかる.
ついでにMacOS Xでは
$ ls -alF /bin/sh
/bin/sh*
$ ls -alF /bin/bash
/bin/bash*
てな感じです.微妙に違う…
で,ちょっと脱線しましたが最後にデーモンを動かしてみる.

 daemonを動かす
$ sudo service jetty start

CentOSにjettyを導入する


前提

・CentOSにjdkが入っている
・sudoコマンドが使える

install jetty

 eclipse.orgからjettyをインストール
$ cd ~
$ mkdir workspace
$ cd workspace
$ wget http://download.eclipse.org/jetty/stable-8/dist/jetty-distribution-8.1.8.v20121106.tar.gz
--日付--  http://download.eclipse.org/jetty/stable-8/dist/jetty-distribution-8.1.8.v20121106.tar.gz

いろいろメッセージが表示される

`jetty-distribution-8.1.8.v20121106.tar.gz' に保存中

100%[======================================>] 9,064,609    615K/s 時間 18s     

日付 (494 KB/s) - `jetty-distribution-8.1.8.v20121106.tar.gz' へ保存完了 [9064609/9064609]
 tar展開
$ tar xvzf ./jetty-distribution-8.1.8.v20121106.tar.gz
 jettyを/usr/local/に移動
$ sudo mv ./jetty-distribution-8.1.8.v20121106 /usr/local/jetty-distribution-8.1.8.v20121106

$ cd /usr/local/
$ ls -a
.
..
jetty-distribution-8.1.8.v20121106
 シンボリック作成
$ sudo ln -s /usr/local/jetty-distribution-8.1.8.v20121106/ /usr/local/jetty8
$ ls -a
.
..
jetty8
jetty-distribution-8.1.8.v20121106
 8080port開放
$ sudo vim /etc/sysconfig/iptables
以下を追加
# added begin
-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
# added end
 jetty起動
$ cd /usr/local/jetty8/
$ java -jar start.jar
 起動確認
http://ホストネーム:8080
にアクセスして,jettyのページが表示されればおk.

 強制停止
$ sudo kill -9 `pgrep -f "java -jar start.jar"`

あとはApacheの連携とか,daemon化とか…

2012年7月29日日曜日

Eclipse indigo + WTP + Jetty WTP PluginでWeb Application メモ

Jettyを試してみたくなったので,そのための環境構築メモ.

  • 開発環境
jdk 1.7.0_05
Eclipse Classic 3.7.1 - indigo
jetty-8.1.5.v20120716
---

  • Eclipse Plugin install
WTPのPluginは

http://download.eclipse.org/webtools/repository/indigo/

Jetty WTP Pluginは

http://download.eclipse.org/jetty/updates/jetty-wtp

から,それぞれインストール.

  • EclipseでServer Project作成
まず,EclipseでServer Projectを作成する.
この作業は,eclipseのJetty WTP Pluginのページを参考にした.

http://wiki.eclipse.org/Jetty_WTP_Plugin/Jetty_WTP_Create_Server


  • サンプルアプリケーション作成
これも同様に,eclipseのJetty WTP Pluginのページを参考にした.

http://wiki.eclipse.org/Jetty_WTP_Plugin/Jetty_WTP_Dynamic_Web_Project

上の参考の Step 6 で
以下のような

Caused by: java.lang.NoClassDefFoundError: javax/transaction/UserTransaction

エラーが出たが,以下の2つのページを参考にして解決することができた.

知らんがな - Jetty 8 on Fedora 17 (x86_64)
stackoverflow

必要なjarファイルは以下サイトからダウンロードできる.

http://download.java.net/maven/2/javax/transaction/jta/1.0.1B/

あとは例のごとく,ブラウザで以下にアクセスして,表示ができれば環境構築は完了.

http://localhost:8080/mywebapp/