JavaEE」カテゴリーアーカイブ

JSON Processing(JSR-353)に寄り道1

Websocketで複数のデータを送ろうとした際に、JavaEE7でJSON Processingが出てたのを思い出したので触ってみた。

ArunさんのブログにあるようにJSONとObject間のデータバインディングまではやってくれない。

(Note, binding JSON to Java objects and vice versa is not part of the scope of this JSR.)

想定用途(?)を探して見つけたブログによるとStaxでDom操作する感覚で使えるよとのこと。

->JCPにしっかり書いてあった。(2.1)

 

利用設定(Maven)

pomに依存関係を追加

        <!-- JSON Processing (JSR-353) -->
        <dependency>
            <groupId>javax.json</groupId>
            <artifactId>javax.json-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.json</artifactId>
            <version>1.0.2 </version>
        </dependency>

試したソース

import javax.json.Json;
import javax.json.JsonObject;
import javax.json.stream.JsonParser;

public class FirstJson01 {
    public static void main(String[] args) {
        System.out.println("生成");
        JsonObject model = Json.createObjectBuilder()
                   .add("firstName", "Duke")
                   .add("lastName", "Java")
                   .add("age", 18)
                   .add("streetAddress", "100 Internet Dr")
                   .add("city", "JavaTown")
                   .add("state", "JA")
                   .add("postalCode", "12345")
                   .add("phoneNumbers", Json.createArrayBuilder()
                      .add(Json.createObjectBuilder()
                         .add("type", "mobile")
                         .add("number", "111-111-1111"))
                      .add(Json.createObjectBuilder()
                         .add("type", "home")
                         .add("number", "222-222-2222")))
                   .build();

        String text = model.toString();
        System.out.println(text);

        System.out.println("解析");
        StringReader sr = new StringReader(text);
        JsonParser parser = Json.createParser(sr);
        while(parser.hasNext()){
            JsonParser.Event event = parser.next();
            System.out.println(event);
        }
    }
}

Eventの種類はSTART_OBJECT/END_OBJECT、START_ARRAY/END_ARRAY、KEY_NAME、VALUE_STRING、VALUE_NUMBER、VALUE_TRUE、VALUE_FALSE、VALUE_NULL。

 

 

 

WebSocketを使ってみる。その4

続けて@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(JSR 356)を使ってみる。その3

これまでに引き続き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)

WebSocket(JSR 356)を使ってみる。その2

先日に続き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)に返すサンプルがあるgetAsyncRemotegetBasicRemote()を試してみる。APIによると非同期か同期かの違いらしい。

 @OnMessageのgetAsyncRemote/getBasicRemote

ソースを書き換えてみたけれども、getAsyncRemotegetBasicRemoteの両方とも同時にalert(“Calling”);まで進む。

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するための追加手順

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)

WebSocket(JSR 356)を使ってみる。その1(まずは軽く触れてみる)

EclipseからGlassfishを使う環境は何とかできたっぽいのでWebSocketを使ってみる。

少し前の情報からアノテーションがダイナミックに変わっているので注意。

@WebSocketEndpoint -> @ServerEndpointとかとか(リンク

 

こちらのブログを参考にまずはほぼコピペして動作確認。

キャプチャを簡単にできるかと軽く見てみたけどIE10の開発ツールは特に表示されない模様。

FFのTamperData(プラグイン)では、Connectionがupgradeされていることまでは確認できたけど、upgrade後の動作は見れない模様。コネクションクローズ等も拾えなかった。

WebSocketキャプチャ

(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

JavaEE7(GlassFish4.0)のEclipse4.3(Kepler)におけるMaven(M2E)連携

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だとアップデートでいいかどうかを聞かれるがとりあえず次へ次へとそのままインストール

WTPインストール手順1

WTPインストール手順2

WTPインストール手順3

 

新規->MavanプロジェクトからMavanプロジェクトを作成しようとしたところ、アーキタイプにwebapp-javaee7が無い。(Eclipse4.2ではこれででてきた記憶がある。。)

Mavenプロジェクト追加1-1

 

理由があって外されたか、間にあっていないだけかは不明。

取り急ぎ、Mavenのリモートカタログを追加して凌ぐことにする。

ウィンドウ->設定->Maven->アーキタイプ->リモートカタログの追加から

http://repo1.maven.org/maven2/archetype-catalog.xmlをリモートカタログとして追加。

 

Maven2-1

Maven2-2

 

Eclipse再起動後(?)にwebapp-javaee7が選べるようになっているので指定しMavenプロジェクトとして作成。

Mavenプロジェクト追加1-1i

 

以下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をきちんと書いたほうがいいのかもしれないけどリンク先がわからなくなった。一応中国語参考のリンク

フィックス1

フィックス2

途中で対象を聞かれるのでとりあえずデフォルト

フィックス3

修正がすんだらプロジェクトをAlt+F5でMavenビルドしてサーバに追加したらOK。

 

リンク

GlassFish4まだろくに触っていないけど、Eclipse4.3(Kepler)がリリースされたので連携してみる。

Oracleのサイトを見ると、OEPEのUpdateManagerのリモートロケーションはまだ対応していないみたい。

OEPEリモート対応状況

 

アーカイブからのupdateは対応済みなのでいったん、Zipをダウンロード。

oepeレポジトリ

 

ヘルプ->新規ソフトウェアのインストール->使用可能なソフトウェアサイト->追加から先ほどのZipを指定。

b

 

追加したソフトウェアサイトからGlassFishツールをインストール。(ついでにドキュメントも)

プラグイン選択

 

そのまま次へ次へ同意とぽちぽち押して再起動。

 

07/09追加

Debugができなかったらリンク先の手順も追加

 

GlassFish4インストール(Eclipse4.2 Juno連携)

先日リリースされたGlassFish4をインストールしてEclipse(4.2/Juno)と連携する。

 

GlassFish4インストール

まずは、GlassFish4をダウンロード。

https://glassfish.java.net/download.html

1

 

ダウンロードした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ツールをインストール。

Update Manager

更新サイトアドレス

選択プラグイン

インストール後eclipseの再起動を求められるので再起動を実行する。

 

Eclipse上でのサーバ・プロジェクト設定

(サーバ設定)

ファイル->新規->その他->サーバー->サーバーを選択。

8

 

サーバの種類選択画面が出るのでGlassfish4.0を選択

9

 

設定を聞かれるのでJREとGlassFishのインストールディレクトリを指定

10

 

管理者のIDとパスワードを指定

11

 

(プロジェクト設定)

ファイル->新規->動的WebProjectを選択。

名前を任意入力し次へ

12

 

そのまま次へ

13

 

web.xmlデプロイメント記述子の生成にチェックをいれて完了

14

 

疎通確認用に作成したプロジェクトのWebContent配下にindex.htmlを作成。

16

 

サーバタグから、GlassFishに作成したプロジェクトを追加。

17

 

サーバタグのGlassFishに関するステータスが「始動済み、同期済み」となっていることを確認し

プロジェクトのトップページ(http://localhost:8080/プロジェクト名/)にアクセス。

作成したhtmlが表示されていれば疎通はOK

18

 

使い出しなので誤りあるかもしれませんが、気づいたら順次修正します

 

07/09追加

Debugができなかったらリンク先の手順も追加