ページが読み込まれるときに、一般的なSSEを登録しました。
クライアント:
sseTest: function(){
var source = new EventSource('mySSE');
source.onopen = function(event){
console.log("eventsource opened!");
};
source.onmessage = function(event){
var data = event.data;
console.log(data);
document.getElementById('sse').innerHTML+=event.data + "<br />";
};
}
私のJavascript-Debuggerは、「eventsourceがオープンしました!」と言っています。成功しました。
私のサーバーコードはサーブレット3.0です。
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns={"/mySSE"}, name = "hello-sse", asyncSupported=true)
public class MyServletSSE extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/event-stream");
resp.setCharacterEncoding("UTF-8");
Random random = new Random();
PrintWriter out = resp.getWriter();
//AsyncContext aCtx = req.startAsync(req, resp);
//ServletRequest sReq = aCtx.getRequest();
String next = "data: " + String.valueOf(random.nextInt(100) + 1) + "\n\n";
//out.print("retry: 600000\n"); //set the timeout to 10 mins in milliseconds
out.write(next);
out.flush();
// do not close the stream as EventSource is listening
//out.close();
//super.doGet(req, resp);
}
}
コードは機能します!Client-Codeは、3秒ごとにdoGet()-メソッドをトリガーし、新しいデータを取得します。
質問: しかし、Async-SupportやasyncContext.addListener(asyncListener)などの新しいサーブレット3.0 Futuresや、私が知らない何かを使用して、このコードを改善するにはどうすればよいのでしょうか。ストリームを閉じることはないので、サーバーはどのように拡張されるのでしょうか。
理論的には、最良のアプローチは、新しいデータが存在するときにサーバー側のコードを介してdoGet()-メソッドを明示的にトリガーすることです。したがって、クライアントはクライアント側の「onmessage()」-メソッドをトリガーする必要はありません。サーバー側"doGet()"-新しいデータを3秒ごとにメソッドします。