メモ代わりに
変化も多そうなので他に手をつけてから。
続けて@PathParamを試してみる。
APIによると
ServerEndpointに{パラメータ}で指定した値とバインドしてくれるらしい。
変数として使える型はStringかプリミティブOrそのボクシング型とのこと。
ただし、パラメータがデコードできなかったらエラーハンドラーを呼び出すらしい。
Java (zip:paramBindTest)
import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/hello/{hoge}/{fuga}") public class HelloWorld { static Set<Session> sessions = Collections .synchronizedSet(new HashSet<Session>()); @OnMessage public void onMessage(String message, @PathParam("hoge") Integer hoge,@PathParam("fuga") String fuga) { System.out.println("message[" + message + "]"); System.out.println("hoge[" + hoge + "]"); System.out.println("fuga[" + fuga + "]"); for (Session s : sessions) { s.getAsyncRemote().sendText(message); } }
JS
$(document).ready(function(){ var host="ws://localhost:8080/first/hello/12/ああ"; socket = new WebSocket(host); socket.onmessage = function(message){ $('#log').append(message.data + "<br/>"); }
結果
情報: 開始します:8ca15fe1-a79d-420e-afc6-3c5ab18a75ec 情報: message[あsdf] 情報: hoge[12] <- ボクシング型にバインドされている 情報: fuga[ああ] <- 日本語も素直にバインドされる模様
日本語もそのままうまくバインドされた。
ためしにIntegerの部分を少数にしたらNumberFormatExceptionをチェーンしたDecodeExceptionが発生。このケースは切り分け難しくない。
情報: エラーです:9366a9f2-2b24-4be3-8897-40427563d56e 重大: javax.websocket.DecodeException: Decoding failed at org.glassfish.tyrus.core.PrimitiveDecoders$IntegerDecoder.decode(PrimitiveDecoders.java:165) at org.glassfish.tyrus.core.PrimitiveDecoders$IntegerDecoder.decode(PrimitiveDecoders.java:157) at org.glassfish.tyrus.core.AnnotatedEndpoint$2.value(AnnotatedEndpoint.java:362) at org.glassfish.tyrus.core.AnnotatedEndpoint.callMethod(AnnotatedEndpoint.java:428) at org.glassfish.tyrus.core.AnnotatedEndpoint.access$100(AnnotatedEndpoint.java:83) at org.glassfish.tyrus.core.AnnotatedEndpoint$WholeHandler$1.onMessage(AnnotatedEndpoint.java:518) at org.glassfish.tyrus.core.SessionImpl.notifyMessageHandlers(SessionImpl.java:389) at org.glassfish.tyrus.core.EndpointWrapper.onMessage(EndpointWrapper.java:495) at org.glassfish.tyrus.server.TyrusEndpoint.onMessage(TyrusEndpoint.java:174) at org.glassfish.tyrus.websockets.DefaultWebSocket.onMessage(DefaultWebSocket.java:156) at org.glassfish.tyrus.websockets.frametypes.TextFrameType.respond(TextFrameType.java:66) at org.glassfish.tyrus.websockets.DataFrame.respond(DataFrame.java:102) at org.glassfish.tyrus.servlet.TyrusHttpUpgradeHandler.onDataAvailable(TyrusHttpUpgradeHandler.java:113) at org.apache.catalina.connector.InputBuffer$ReadHandlerImpl.processDataAvailable(InputBuffer.java:488) at org.apache.catalina.connector.InputBuffer$ReadHandlerImpl.onDataAvailable(InputBuffer.java:453) at org.glassfish.grizzly.http.io.InputBuffer.append(InputBuffer.java:855) at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:222) at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114) at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) at java.lang.Thread.run(Thread.java:724) Caused by: java.lang.NumberFormatException: For input string: "1.2" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:492) at java.lang.Integer.valueOf(Integer.java:582) at org.glassfish.tyrus.core.PrimitiveDecoders$IntegerDecoder.decode(PrimitiveDecoders.java:163) ... 30 more
nullとした場合も素直にエラー
var host="ws://localhost:8080/first/hello/null/ああ"; -> Caused by: java.lang.NumberFormatException: For input string: "null"
空文字だと、予想外に素直なエラー
var host="ws://localhost:8080/first/hello//ああ"; -> Caused by: java.lang.NumberFormatException: For input string: ""
最後の文字列が空文字だと空文字としてバインドされる。
var host="ws://localhost:8080/first/hello/12/"; -> 情報: 開始します:75b4bc74-30e9-4a69-8af3-07ed67e6a296 情報: message[あ] 情報: hoge[12] 情報: fuga[]
/{空文字}/{数字}の順でも動いた。(//となるので環境次第では不具合が出る??)
@ServerEndpoint("/hello/{fuga}/{hoge}")と最初を文字列にする -> var host="ws://localhost:8080/first/hello//12"; -> 情報: 開始します:028c5db1-a60f-4d82-970f-8933058b2bfb 情報: message[あああ] 情報: hoge[12] 情報: fuga[]
{変数名}と@PathParamで誤記をするとバインドされない(null)。
@ServerEndpoint("/hello/{fuga}/{hoge}") -> public void onMessage(String message, @PathParam("hoge") Integer hoge, @PathParam("fuga2") String fuga) -> 情報: 開始します:49d01de4-4a6b-4b81-8c71-d6d48d9f0600 情報: message[あ] 情報: hoge[12] 情報: fuga[null]
URLパラーンの違いによっては呼び出されない。
一つ前のnullがバインドされる事象はバインド対象が不整合でも動いていたけど、そっちが中途半端に動いているだけで、呼び出されないのが正しいのかな??
@ServerEndpoint("/hello/{hoge}") <-fuga2はない -> public void onMessage(String message, @PathParam("hoge") Integer hoge,] @PathParam("fuga2") String fuga) { -> 23:27:25.244[23ms][total 23ms] Status: 404[Not Found] GET http://localhost:8080/first/hello/12/nasi Load Flags[LOAD_BYPASS_CACHE LOAD_BACKGROUND INHIBIT_CACHING ] Content Size[-1] Mime Type[application/x-unknown-content-type] Request Headers: Host[localhost:8080] User-Agent[Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0] Accept[text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8] Accept-Language[ja,en-us;q=0.7,en;q=0.3] Accept-Encoding[gzip, deflate] Sec-WebSocket-Version[13] Origin[http://localhost:8080] Sec-WebSocket-Key[gq8u2S2nXT2xpIagf7qPaQ==] Cookie[JSESSIONID=e1e94c1a637e58c7ccaa61c6f17e] Connection[keep-alive, Upgrade] Pragma[no-cache] Cache-Control[no-cache] Upgrade[websocket] Response Headers: X-Powered-By[Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition 4.0 Java/Oracle Corporation/1.7)] Server[GlassFish Server Open Source Edition 4.0] Set-Cookie[JSESSIONID=e2121d0c30e627004af713703b3d; Path=/first; HttpOnly]
これまでに引き続きWebSocketを試してみる。
APIをみるとgetOpenSessions()というメソッドがあり、そのセッションに紐付くセッションが取れるとのこと。また、OnMessageアノテーションの説明によるとPOJOのメソッド引数にSessionをオプショナルな引数として渡せるとのこと。
下のように引数にセッションを追加してやって、そのセッションからgetOpenSessionsを呼んでやれば対向のエンドポイントにメッセージを送れた。
package hp.co.epea.first; import java.util.Set; import javax.websocket.OnClose; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/hello") public class HelloWorld { /* * sessionOfEndPointとsessionOfClientEndPointという名前になっているけど * 勘違いしていたことによるよくない名前。 * 引数のSessionはリクエストを出したPeerと受け取ったPeer間のSessionなので * sessionOfCurrentReqみたいなもの。 * getOpenSessionsで取得できるのはそのsessionが持つendPointに紐付くやつなので * sessionOfRelatedみたいなものが本来 */ @OnMessage public void onMessage(String message,Session sessionOfSvEndPoint) { Set<Session> sessionsOfClientEndPoint = sessionOfSvEndPoint.getOpenSessions(); System.out.println("sessionsOfClientEndPoint.size():" +sessionsOfClientEndPoint.size()); System.out.println("message[" + message + "]"); for (Session s : sessionsOfClientEndPoint) { s.getAsyncRemote().sendText(message); } } @OnOpen public void open(Session sess) { System.out.println("開始します:" + sess.getId()); } @OnClose public void close(Session sess) { System.out.println("終了します:" + sess.getId()); } @OnError public void error(Session sess, Throwable t) { System.out.println("エラーです:" + sess.getId()); t.printStackTrace(); } }
※他の方が書いている記事を発見
対向のエンドポイントが閉じられた場合(こちらのOnCloseが終わったら?)そのエンドポイントはないものと扱われている。
(3つ開いている) 情報: 開始します:07d672db-af64-435c-a272-2698528927f1 情報: 開始します:91202881-63ac-45b8-a3a1-d53e7bdc2008 情報: 開始します:628fc0c0-9cde-4812-a12b-d2ce52cc146e 情報: sessionsOfClientEndPoint.size():3 <-開いている数 情報: message[あああ] (1つ閉じて2個にする) 情報: 終了します:628fc0c0-9cde-4812-a12b-d2ce52cc146e 情報: sessionsOfClientEndPoint.size():2 <-開いている数 情報: message[いいい]
ただこのやり方だとsessionOfSvEndPoint.getOpenSessions()してからfor文が回っている間にコネクションが閉じられるとコネクションクローズ済みエラーが飛んでしまう。前の書き方のほうがいいのかな。
情報: 開始します:68d4f179-7c99-4118-b829-f48f7fc9d670 情報: 開始します:83ccdfea-f0b8-4dc5-8cc3-3d9bddebc658 情報: sessionsOfClientEndPoint.size():2 <-セッションのコピーをとる 情報: message[a] 情報: 終了します:83ccdfea-f0b8-4dc5-8cc3-3d9bddebc658 <-for文の前に(or途中で)閉じる 情報: エラーです:68d4f179-7c99-4118-b829-f48f7fc9d670 <- OnErrorの引数で入ってくるのは実際に例外の原因となったものでなくてOnmessageを呼んだSessionの模様。 重大: java.lang.IllegalStateException: The connection has been closed. at org.glassfish.tyrus.core.SessionImpl.checkConnectionState(SessionImpl.java:343) at org.glassfish.tyrus.core.SessionImpl.getAsyncRemote(SessionImpl.java:180) at hp.co.epea.first.HelloWorld.onMessage(HelloWorld.java:22) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.glassfish.tyrus.core.AnnotatedEndpoint.callMethod(AnnotatedEndpoint.java:431) at org.glassfish.tyrus.core.AnnotatedEndpoint.access$100(AnnotatedEndpoint.java:83) at org.glassfish.tyrus.core.AnnotatedEndpoint$WholeHandler$1.onMessage(AnnotatedEndpoint.java:518) at org.glassfish.tyrus.core.SessionImpl.notifyMessageHandlers(SessionImpl.java:389) at org.glassfish.tyrus.core.EndpointWrapper.onMessage(EndpointWrapper.java:495) at org.glassfish.tyrus.server.TyrusEndpoint.onMessage(TyrusEndpoint.java:174) at org.glassfish.tyrus.websockets.DefaultWebSocket.onMessage(DefaultWebSocket.java:156) at org.glassfish.tyrus.websockets.frametypes.TextFrameType.respond(TextFrameType.java:66) at org.glassfish.tyrus.websockets.DataFrame.respond(DataFrame.java:102) at org.glassfish.tyrus.servlet.TyrusHttpUpgradeHandler.onDataAvailable(TyrusHttpUpgradeHandler.java:113) at org.apache.catalina.connector.InputBuffer$ReadHandlerImpl.processDataAvailable(InputBuffer.java:488) at org.apache.catalina.connector.InputBuffer$ReadHandlerImpl.onDataAvailable(InputBuffer.java:453) at org.glassfish.grizzly.http.io.InputBuffer.append(InputBuffer.java:855) at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:222) at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114) at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) at java.lang.Thread.run(Thread.java:724)
先日に続きOracleのサイトをみながらぼちぼち試していきます。
@OnMessageの戻り値
If the return type of the method annotated with @OnMessage
is not void
, the WebSocket implementation will send the return value to the other peer.
戻り値付のメソッドの場合、その値をpeerに返すというような事が書いてあるので試してみる。
(ソース)
@OnMessage
public String onMessage(String message) {
System.out.println(“message[” + message + “]”);
return message;
}
実際にメッセージを送ったブラウザには戻り値が帰ってきたことを確認できた。
ただし、開いていた他のブラウザには送信されていない。
peerと書いているだけなので複数に返すのでなく単独のものに返すという動作という認識であっているのかな??
疑問は残るけど、複数ブラウザ(peer)に返すサンプルがあるgetAsyncRemote
、getBasicRemote()
を試してみる。APIによると非同期か同期かの違いらしい。
@OnMessageのgetAsyncRemote/getBasicRemote
ソースを書き換えてみたけれども、
とgetAsyncRemote
の両方とも同時にalert(“Calling”);まで進む。getBasicRemote
RemoteEndpoint.Basic
をみると下のように書かれているのでのでJSのAlert文で待ちが入るというわけではないらしい。
The point of completion of the send is defined when all the supplied data has been written to the underlying connection
送信失敗に備えたエラー処理をするためのもので、Endpoint間の同期をとる目的でないということでよいのかな。
(java)
static Set<Session> sessions = Collections
.synchronizedSet(new HashSet<Session>());
@OnMessage
public void onMessage(String message) {
System.out.println(“message[” + message + “]”);
for (Session s : sessions) {
s.getAsyncRemote().sendText(message);
}
}
@OnMessage
public void onMessage(String message) throws IOException {
System.out.println(“message[” + message + “]”);
for (Session s : sessions) {
s.getBasicRemote().sendText(message);
}
}
(JS)
socket.onmessage = function(message){
alert(“Calling”);
$(‘#log’).append(message.data + “<br/>”);
}
EclipseでGlassfish4をDebugしようとすると、69%起動とでてそこで固まってしまう事象が発生。(というか、Debugをしたら毎回だった。)
調べると、”Glassfish 4.0 adapter in Eclipse”のバグとのこと。
(7/11追記)
改めてバグ情報を見直すと下のようにあるのでGlassFishの3系でも発生していた模様。
Same issue than chemi, fresh Kepler 64 bits installation on Windows 7 64 bits. Same problem with glassfish 3 or 4.
(7/11追記終了)
(8/4追記)
eclipseのサーバ追加時に設定したglassfish用のID/Passwordと、glassfishに実際に設定してあるID/Passwordが違う場合も発生した。(glassfish 4.0のデフォルトは”admin/無”っぽい)
(8/4追記終了)
Fix版でていてUpdateManager経由でインストールできるとのことなので早速インストール。
http://download.java.net/glassfish/eclipse/juno
インストール後Eclipse再起動し、Eclipse上でのサーバ(サーバビューに出るやつ)も再度作り直した。
完全に死にきっていないものがあったのかPortがふさがっている旨のメッセージが出たのでPCごと再起動したところ、無事にデバッグできるようになった。
DebugできなかったときEclipseのlogに出ていたスタックトレースは以下のはず。(退避していなかったけど時間的におそらく。。。)
(起動時)
!ENTRY oracle.eclipse.tools.glassfish 4 150 2013-07-08 17:35:17.312
!MESSAGE Unable to start server on time.
!STACK 0
java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:258)
at java.util.concurrent.FutureTask.get(FutureTask.java:119)
at oracle.eclipse.tools.glassfish.GlassfishGenericServerBehaviour.launchServer(GlassfishGenericServerBehaviour.java:170)
at oracle.eclipse.tools.glassfish.GlassfishServerLaunchDelegate.startDASAndTarget(GlassfishServerLaunchDelegate.java:201)
at oracle.eclipse.tools.glassfish.GlassfishServerLaunchDelegate.launch(GlassfishServerLaunchDelegate.java:109)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:858)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:707)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:700)
at org.eclipse.wst.server.core.internal.Server.startImpl2(Server.java:3537)
at org.eclipse.wst.server.core.internal.Server.startImpl(Server.java:3473)
at org.eclipse.wst.server.core.internal.Server$PublishJob.run(Server.java:311)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)
(再起動時)
!ENTRY oracle.eclipse.tools.glassfish 4 1 2013-07-09 22:42:05.118
!MESSAGE GlassFish: in SunAppServerBehaviour restart
!STACK 1
org.eclipse.core.runtime.CoreException: Unable to start server on time.
at oracle.eclipse.tools.glassfish.GlassfishServerLaunchDelegate.abort(GlassfishServerLaunchDelegate.java:73)
at oracle.eclipse.tools.glassfish.GlassfishServerLaunchDelegate.startDASAndTarget(GlassfishServerLaunchDelegate.java:205)
at oracle.eclipse.tools.glassfish.GlassfishServerLaunchDelegate.launch(GlassfishServerLaunchDelegate.java:109)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:858)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:707)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:700)
at oracle.eclipse.tools.glassfish.GlassfishGenericServerBehaviour$1.run(GlassfishGenericServerBehaviour.java:238)
Caused by: java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:258)
at java.util.concurrent.FutureTask.get(FutureTask.java:119)
at oracle.eclipse.tools.glassfish.GlassfishGenericServerBehaviour.launchServer(GlassfishGenericServerBehaviour.java:170)
at oracle.eclipse.tools.glassfish.GlassfishServerLaunchDelegate.startDASAndTarget(GlassfishServerLaunchDelegate.java:201)
… 5 more
!SUBENTRY 1 oracle.eclipse.tools.glassfish 4 150 2013-07-09 22:42:05.118
!MESSAGE Unable to start server on time.
!STACK 0
java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:258)
at java.util.concurrent.FutureTask.get(FutureTask.java:119)
at oracle.eclipse.tools.glassfish.GlassfishGenericServerBehaviour.launchServer(GlassfishGenericServerBehaviour.java:170)
at oracle.eclipse.tools.glassfish.GlassfishServerLaunchDelegate.startDASAndTarget(GlassfishServerLaunchDelegate.java:201)
at oracle.eclipse.tools.glassfish.GlassfishServerLaunchDelegate.launch(GlassfishServerLaunchDelegate.java:109)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:858)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:707)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:700)
at oracle.eclipse.tools.glassfish.GlassfishGenericServerBehaviour$1.run(GlassfishGenericServerBehaviour.java:238)
EclipseからGlassfishを使う環境は何とかできたっぽいのでWebSocketを使ってみる。
少し前の情報からアノテーションがダイナミックに変わっているので注意。
@WebSocketEndpoint -> @ServerEndpointとかとか(リンク)
こちらのブログを参考にまずはほぼコピペして動作確認。
キャプチャを簡単にできるかと軽く見てみたけどIE10の開発ツールは特に表示されない模様。
FFのTamperData(プラグイン)では、Connectionがupgradeされていることまでは確認できたけど、upgrade後の動作は見れない模様。コネクションクローズ等も拾えなかった。
(request)
Status=Web Socket Protocol Handshake – 101
X-Powered-By=Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition 4.0 Java/Oracle Corporation/1.7)
Server=GlassFish Server Open Source Edition 4.0
Connection=Upgrade
Sec-WebSocket-Accept=ZjJVgnGKxiMQbZjHxqx5bR7qVGY=
Upgrade=websocket
(responce)
Host=localhost:8080
User-Agent=Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0
Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language=ja,en-us;q=0.7,en;q=0.3
Accept-Encoding=gzip, deflate
Sec-WebSocket-Version=13
Origin=http://localhost:8080
Sec-WebSocket-Key=LLDpCnocJ5IY/JIJfax1mw==
Cookie=JSESSIONID=2718b10db58913be398a83618d52
Connection=keep-alive, Upgrade
Pragma=no-cache
Cache-Control=no-cache
Upgrade=websocket
Chromeのデベロッパーツールでも同様に、Upgradeまでしか拾えない模様。
なお、Wiresharkだとキャプチャできるとのことなので後ほど使ってみる。
ちなみに下のようにアノテーションを削った場合は404と素直なエラーがでてくれた。
//@ServerEndpoint(“/hello”)
public class HelloWorld {
Status=Not Found – 404
X-Powered-By=Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition 4.0 Java/Oracle Corporation/1.7)
Server=GlassFish Server Open Source Edition 4.0
Eclipse4.3でMavenプロジェクトを作成しようとしたら手間だったので手順の記録。
最初にm2e-wtp(Mavan Integration for Eclipse WTP)をマーケットプレースからインストール。
ヘルプ->Eclipseマーケットプレース->検索で「m2e-wtp」にてインストールを実行。
Junoと書いてあるがリリース元によると”m2e-wtp 1.0.0 adds Java EE 7 support in Kepler”となっている。
Pleiades All in Oneだとアップデートでいいかどうかを聞かれるがとりあえず次へ次へとそのままインストール
新規->MavanプロジェクトからMavanプロジェクトを作成しようとしたところ、アーキタイプにwebapp-javaee7が無い。(Eclipse4.2ではこれででてきた記憶がある。。)
理由があって外されたか、間にあっていないだけかは不明。
取り急ぎ、Mavenのリモートカタログを追加して凌ぐことにする。
ウィンドウ->設定->Maven->アーキタイプ->リモートカタログの追加から
http://repo1.maven.org/maven2/archetype-catalog.xmlをリモートカタログとして追加。
Eclipse再起動後(?)にwebapp-javaee7が選べるようになっているので指定しMavenプロジェクトとして作成。
以下m2eのライフサイクルのエラーが出るのでクイックフィックスから修正。
Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-dependency-plugin:2.6:copy (execution: default, phase: validate)
(lifecycle-mapping-metadata.xmlをきちんと書いたほうがいいのかもしれないけどリンク先がわからなくなった。一応中国語参考のリンク)
途中で対象を聞かれるのでとりあえずデフォルト
修正がすんだらプロジェクトをAlt+F5でMavenビルドしてサーバに追加したらOK。
GlassFish4まだろくに触っていないけど、Eclipse4.3(Kepler)がリリースされたので連携してみる。
Oracleのサイトを見ると、OEPEのUpdateManagerのリモートロケーションはまだ対応していないみたい。
アーカイブからのupdateは対応済みなのでいったん、Zipをダウンロード。
ヘルプ->新規ソフトウェアのインストール->使用可能なソフトウェアサイト->追加から先ほどのZipを指定。
追加したソフトウェアサイトからGlassFishツールをインストール。(ついでにドキュメントも)
そのまま次へ次へ同意とぽちぽち押して再起動。
07/09追加
Debugができなかったらリンク先の手順も追加
先日リリースされたGlassFish4をインストールしてEclipse(4.2/Juno)と連携する。
GlassFish4インストール
まずは、GlassFish4をダウンロード。
https://glassfish.java.net/download.html
ダウンロードしたZipを任意フォルダに展開。
展開されたフォルダ配下にある./glassfish4/bin/asadmin.batをダブルクリック実行。
start-domainで起動実行
http://localhost:4848/
にアクセスしDomain->Administrator Passwordからパスワードを設定。
取り急ぎGlassFishのインストールはここまで。
連携用Pluginインストール
updateサイト(http://download.oracle.com/otn_software/oepe/juno)から
GlassFishツールをインストール。
インストール後eclipseの再起動を求められるので再起動を実行する。
Eclipse上でのサーバ・プロジェクト設定
(サーバ設定)
ファイル->新規->その他->サーバー->サーバーを選択。
サーバの種類選択画面が出るのでGlassfish4.0を選択
設定を聞かれるのでJREとGlassFishのインストールディレクトリを指定
管理者のIDとパスワードを指定
(プロジェクト設定)
ファイル->新規->動的WebProjectを選択。
名前を任意入力し次へ
そのまま次へ
web.xmlデプロイメント記述子の生成にチェックをいれて完了
疎通確認用に作成したプロジェクトのWebContent配下にindex.htmlを作成。
サーバタグから、GlassFishに作成したプロジェクトを追加。
サーバタグのGlassFishに関するステータスが「始動済み、同期済み」となっていることを確認し
プロジェクトのトップページ(http://localhost:8080/プロジェクト名/)にアクセス。
作成したhtmlが表示されていれば疎通はOK
使い出しなので誤りあるかもしれませんが、気づいたら順次修正します
07/09追加
Debugができなかったらリンク先の手順も追加