java - Atmosphere Java Servlet 服务器发送事件

标签 java javascript jquery servlets atmosphere

这是我第一次在 Atmosphere 中工作,对我来说这非常艰难。 我想要的是,用户从我的 API(Java Servlet/Tomcat)接收推送消息。

我正在使用 jquery.atmosphere.js 和以下应用程序代码:

checkForMenuUpdates: function () {
        var self = this;
        checkUpdates();
        function checkUpdates() {
            var request = {url: path.apiPath + 'user.checkUpdates?token=' + token,                    
                logLevel: 'debug',
                'enableXDR': true,
                transport: 'sse',
                trackMessageLength: "false",
                fallbackTransport: 'long-polling'};

            request.onOpen = function (response) {

            };
            request.onMessage = function (response) {

            }
            var socket = jqueryAtmosphere;
            var subSocket = socket.subscribe(request);
        }

    },

服务器端: Controller :

  else if ("user.checkUpdates".equals(pathInfo)) {
            try {
              AtmosphereBroadcaster atmo=new AtmosphereBroadcaster();
              atmo.subscribe(response);
                //ServerSentEvents updates = new ServerSentEvents();
                //updates.establishConnection(token.getUserId(), response, callback);
            } catch (Exception ex) {
                ErrorHandler error = new ErrorHandler();
                error.Error400(response, callback);
            }
        }

“广播者”:

private @PathParam("token")
Broadcaster topic;

public SuspendResponse<String> subscribe(HttpServletResponse httpResponse) {
    StandardResponse res = new StandardResponse();
    httpResponse = res.standardResponseSSE(httpResponse);
    return new SuspendResponse.SuspendResponseBuilder<String>()
            .broadcaster(topic)
            .outputComments(true)
            .addListener(new EventsLogger())
            .build();

}

public static void push(String message, String topic) {

    Collection<Broadcaster> broadcasters = BroadcasterFactory.getDefault().lookupAll();

    for (Broadcaster b : broadcasters) {
        System.out.println(b.toString());
    }

    System.out.println("Request to push- Message: " + message + ", Topic: " + topic);
    Broadcaster b = null;
    if (null != (b = BroadcasterFactory.getDefault().lookup(JerseyBroadcaster.class, topic))) {
        System.out.println("Request to push- Message: " + message + ", Topic: " + topic);
        b.broadcast(message + "\n");
    }
}

private class EventsLogger implements AtmosphereResourceEventListener {

    @Override
    public void onPreSuspend(AtmosphereResourceEvent are) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void onSuspend(AtmosphereResourceEvent are) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void onResume(AtmosphereResourceEvent are) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void onDisconnect(AtmosphereResourceEvent are) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void onBroadcast(AtmosphereResourceEvent are) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void onThrowable(AtmosphereResourceEvent are) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void onClose(AtmosphereResourceEvent are) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void onHeartbeat(AtmosphereResourceEvent are) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}

以及标准响应:

  public HttpServletResponse standardResponseSSE(HttpServletResponse response) {        
    response.setContentType("text/event-stream");
    response.setCharacterEncoding("UTF-8");
    response.setHeader("Pragma", "no-cache");
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setDateHeader("Expires", -1);
    return response;
}

我从 Chrome 控制台得到以下输出:

上交所成功开业 jquery.atmosphere.js?bust=6539327597711.235:3171 SSE 重新连接最大尝试次数达到 6

对我来说,这听起来像是没有返回消息。我有一个非常基本的示例( https://weblogs.java.net/blog/swchan2/archive/2014/05/21/server-sent-events-async-servlet-example ),运行良好。但对我来说,SSE 不适用于 Atmosphere 框架。

那么这里有什么意义呢?我做错了什么?

编辑:

我知道 JavaScript 代码很奇怪 - 它“正在构建”:)

当然 - 当我将此代码添加到 EventsLogger 时它正在工作:

public EventsLogger(HttpServletResponse response) {
        PrintWriter write = null;

        try {
            write = response.getWriter();
            while (true) {
                write.write("data:Test \n\n");
                write.flush();
                Thread.sleep(1000);
            }

        } catch (IOException ex) {
            Logger.getLogger(AtmosphereBroadcaster.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InterruptedException ex) {
            Logger.getLogger(AtmosphereBroadcaster.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            write.close();
        }
    }

这是心跳未正确发送的问题 - 如何解决这个问题?

最佳答案

停止做:

    throw new UnsupportedOperationException("Not supported yet.");

在监听器中,这会起作用:-)

关于java - Atmosphere Java Servlet 服务器发送事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27549075/

相关文章:

java - 将自定义消息添加到 JUnit4 样式异常测试

java - Joda 时间从 dateTime 获取正确的时间

javascript - 如何在调整字体大小时将文本粘贴到线条上?

php - 我们如何将 jquery 日期选择器放入 chrome 扩展中

jquery - 单击按钮复制到剪贴板

java - 为什么新的 Integer 充当值类型 int?

java - 数据更改后停止将图像加载到 RecyclerView 适配器中的 ImageView 的所有线程的最佳方法

javascript - 如何使用循环多次将 img 插入到 div 中

javascript - 在 3000 端口上使用 https 的 Node.js socket.io

javascript - 比较从数据库检索的两个日期