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