アプリケーションでatmosphereフレームワークを使用しています。
https://github.com/Atmosphere/atmosphere
AbstractReflectorAtmosphereHandlerクラスを拡張し、
-onRequest
-destroy
-onstatechanged
メソッド。
クライアントがサーバーにメッセージを送信したい場合:
subSocket.push(jQuery.stringifyJSON({ data: "blahblah", source:"client" }));
onRequest関数が呼び出されます。しかし、メッセージ
Object message = atmosphereResource.getAtmosphereResourceEvent().getMessage();
空です。
毎回呼び出されるonstatechangedを使ってみたより
(1) The remote connection gets closed, either by a browser or a proxy
(2) The remote connection reach its maximum idle time (AtmosphereResource.suspend))
(3) Everytime a broadcast operation is executed (broadcaster.broadcast)
ただし、1と2を除外した後でも
public void onStateChange(AtmosphereResourceEvent event)
throws IOException {
if (source.equals("client") && !event.isResumedOnTimeout() && !event.isResuming()){
System.out.println("message form client");
System.out.println(message.toString());
} else {
//normal onstatechanged code from AbstractReflectorAtmosphereHandler
}
ただし、メッセージは2〜4回ランダムに印刷されます。一度だけ呼び出す必要があります。
だから私の質問は:onRequestメソッド内のメッセージにアクセスできますか、またはなぜonStateChangeが何度も呼び出されるのですか?
編集:jFによって与えられた答えから、私はonRequest関数内のメッセージにアクセスすることができました。(しかし、それが彼が実際に意味したものであるかどうかはわかりません)。
public void onRequest(AtmosphereResource resource) throws IOException {
//Object message = resource.getAtmosphereResourceEvent().getMessage(); //is empty why?
//leave connection open
resource.suspend();
BufferedReader reader = resource.getRequest().getReader();
Object message = reader.readLine();
if (message !=null){
System.out.println("**onRequest: "+message.toString());
}
}