1

AtmosphereとwebSocketsを使用してJerseyリソースをテストするために、2つのjunitメソッドを作成しました。

問題は、SuspendとBroacastの両方を呼び出すときに、WebSocketTextListenerのonOpenメソッドのみが呼び出されることです。OnError、OnMessage、OnCloseのいずれも呼び出されません:(

OnMessageメソッドが呼び出されない理由はありますか?

雰囲気ジャージーリソース:

@Path("/websocket")
    @Suspend
    @GET
    @Produces({MediaType.APPLICATION_JSON})
    public String suspend() {
        return "";
    }   

    @Path("/websocket")
    @Broadcast(writeEntity = false)
    @POST
    @Produces({MediaType.APPLICATION_JSON})
    public String broadcast(String message) {
        return "BROADCASTTT";
    }  

テストサスペンドWEBSOCKETCALL:

 @Test
    public void testAddMealSubscriber() throws Exception {

        final CountDownLatch latch = new CountDownLatch(1);
        String restaurantId = "SalernoNapoliBarcelona";
        String mealId = "14b74bddc68d6f1b4c22e7f7b200067f";

        String url = "ws://localhost:8080/rest/" + "restaurants/" + restaurantId + "/meals/" + mealId + "/websocket/";

        AsyncHttpClient client = new AsyncHttpClient();

        try {
            final AtomicReference response = new AtomicReference(null);
            WebSocket websocket = client.prepareGet(url)
                    .execute(new WebSocketUpgradeHandler.Builder().addWebSocketListener(
                            new WebSocketTextListener() {

                                @Override
                                public void onMessage(String message) {
                                    System.out.println("WebSocketTextListener onMessage:" + message);
                                    response.set(message);
                                    latch.countDown();
                                }

                                @Override
                                public void onFragment(String fragment, boolean last) {

                                    System.out.println("WebSocketTextListener onFragment:" + fragment);
                                }

                                @Override
                                public void onOpen(WebSocket websocket) {
                                    System.out.println("WebSocketTextListener onOpen");
                                }

                                @Override
                                public void onClose(WebSocket websocket) {
                                    System.out.println("WebSocketTextListener onClose");
                                    latch.countDown();
                                }

                                @Override
                                public void onError(Throwable t) {
                                    System.out.println("WebSocketTextListener onError");
                                    t.printStackTrace();
                                }
                            }).build()).get();

            try {
                latch.await(60, TimeUnit.SECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            assertNotNull(response.get());
            assertEquals(response.get(), "echo");
        } catch (Exception e) {
            e.printStackTrace();
        }

        client.close();

    }

BROADCAST WEBSOCKET CALLのテスト:

 @Test
    public void testAddMealPublisher() throws Exception {

        final CountDownLatch latch = new CountDownLatch(1);
        String restaurantId = "SalernoNapoliBarcelona";
        String mealId = "14b74bddc68d6f1b4c22e7f7b200067f";

        String url = "ws://localhost:8080/rest/" + "restaurants/" + restaurantId + "/meals/" + mealId + "/websocket/";

        AsyncHttpClient c = new AsyncHttpClient();
        try {
            final AtomicReference response = new AtomicReference(null);

            WebSocket websocket = c.prepareGet(url)
                    .execute(new WebSocketUpgradeHandler.Builder().addWebSocketListener(
                            new WebSocketTextListener() {

                                @Override
                                public void onMessage(String message) {
                                    response.set(message);
                                    latch.countDown();
                                }

                                @Override
                                public void onFragment(String fragment, boolean last) {

                                    System.out.println("WebSocketTextListener onFragment:" + fragment);
                                }

                                @Override
                                public void onOpen(WebSocket websocket) {
                                    System.out.println("WebSocketTextListener onOpen");
                                }

                                @Override
                                public void onClose(WebSocket websocket) {
                                    System.out.println("WebSocketTextListener onClose");
                                    latch.countDown();
                                }

                                @Override
                                public void onError(Throwable t) {
                                    System.out.println("WebSocketTextListener onError");
                                    t.printStackTrace();
                                }
                            }).build()).get().sendTextMessage("MESSSAGGGEEEE");


            try {
                latch.await(5, TimeUnit.SECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            assertNotNull(response.get());
            assertEquals(response.get(), "echo");

        } catch (Exception e) {
            e.printStackTrace();
        }

        c.close();

    }

最初にSUSPENDCALLを実行し、次にBRODCAST呼び出しを実行したときのジャージーログ:

2012年7月20日午後1時54分10秒com.sun.jersey.api.container.filter.LoggingFilterフィルター
情報:1*サーバーのインバウンドリクエスト
1> GET http:// localhost:8080 / rest / restaurants / SalernoNapoliBarcelona / meals / 14b74bddc68d6f1b4c22e7f7b200067f / websocket /
1> Sec-WebSocket-バージョン:13
1>アップグレード:WebSocket
1> Sec-WebSocket-Key:Wf7vyIGCD3Sa8StcdsGIkg ==
1>ホスト:localhost:8080
1>受け入れる:* / *
1>ユーザーエージェント:NING / 1.0
1>接続:アップグレード
1>オリジン:http:// localhost:8080
1> X-Atmosphere-Transport:websocket
1>

2012年7月20日午後1時54分31秒com.sun.jersey.api.container.filter.LoggingFilterフィルター
情報:2*サーバーのインバウンドリクエスト
2> GET http:// localhost:8080 / rest / restaurants / SalernoNapoliBarcelona / meals / 14b74bddc68d6f1b4c22e7f7b200067f / websocket /
2> Sec-WebSocket-バージョン:13
2>アップグレード:WebSocket
2> Sec-WebSocket-Key:RH / DbdkwQK1xBwhyhXLkAQ ==
2>ホスト:localhost:8080
2>受け入れる:* / *
2>ユーザーエージェント:NING / 1.0
2>接続:アップグレード
2>オリジン:http:// localhost:8080
2> X-Atmosphere-Transport:websocket
2>

2012年7月20日午後1時54分34秒com.sun.jersey.api.container.filter.LoggingFilterフィルター
情報:3*サーバーのインバウンドリクエスト
3> POST http:// localhost:8080 / rest / restaurants / SalernoNapoliBarcelona / meals / 14b74bddc68d6f1b4c22e7f7b200067f / websocket /
3> X-Atmosphere-Transport:websocket
3> X-Atmosphere-Transport:websocket
3>コンテンツタイプ:application / json
3>

2012年7月20日1:54:34PMcom.sun.jersey.api.container.filter.LoggingFilter $ Adapter finish
情報:3*サーバーのアウトバウンド応答
3
4

1 に答える 1

1

この問題は、SUBSCRIBE呼び出しとBROADCAST呼び出しに2つの異なるAsyncHttpClientが使用されていることが原因で発生します。

これを解決するには、SetUpメソッドに1つのAsyncHttpClientを作成し、両方のテストメソッドで使用します。

 private AsyncHttpClient client;

    @Before
    public void setUp() throws Exception {

         client = new AsyncHttpClient();

    }
于 2012-07-22T11:38:05.740 に答える