アプリケーションの任意のオブジェクトがクライアントにメッセージを送信できる一般的な方法でServer-Sent Eventsのサーバー コードを実装しようとしているので、SSE 専用の特定のサーブレットを実装することにしました。最初のテスト コードは魅力的に機能しましたが、アプリケーションのさまざまな部分からメッセージを送信できるほど柔軟ではありませんでした。そこで、サーブレット オブジェクトへの参照を持つすべてのオブジェクトがクライアントにメッセージを送信できるように、コードを書き直しました。
public class PushServlet extends HttpServlet {
private Thread threadServlet;
private boolean processando=true;
private MensagemSSEBean mensagem;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
threadServlet=Thread.currentThread();
response.setContentType("text/event-stream; charset=utf-8");
while (processando){
if(!pausarThread())
break;
enviarMensagemParaOCliente(response.getWriter());
}
enviarMensagemDeFechamento(response.getWriter());
}
private void enviarMensagemParaOCliente(PrintWriter saida) {
ConversorMensagemSSE conversor = new ConversorMensagemSSE();
saida.print(conversor.converter(mensagem));
saida.flush();
}
private synchronized void enviarMensagemDeFechamento(PrintWriter saida) {
mensagem.setMensagem("#FECHAR_CONEXAO#");
enviarMensagemParaOCliente(saida);
saida.close();
}
public synchronized void enviarMensagem(MensagemSSEBean mensagem) throws IOException {
this.mensagem=mensagem;
threadServlet.notifyAll();
}
public synchronized void finalizar(){
processando=false;
}
private boolean pausarThread() {
try {
threadServlet.wait();
return true;
} catch (InterruptedException e) {
e.printStackTrace();
}
return false;
}
}
ご覧のとおり、"enviarMensagem" が呼び出されるまでサーブレット スレッドを一時停止します。このコードはテストしていません。基本的に、このサーブレット オブジェクトを取得する方法がわからないためです。このサーブレットオブジェクトを任意のオブジェクトから取得する方法を誰かに説明してもらえますか?? もう 1 つの重要な質問ですが、これはこの種の問題に対する理想的なアプローチですか??