Atmosphere Java Servlet Server 发送事件
Atmosphere Java Servlet Server Sent Events
这是我第一次使用氛围,对我来说非常困难。我想要的是,用户从我的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);
}
},
服务器端:控制器:
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 不适用于大气框架。
那么这里有什么意义呢?我做错了什么?
编辑:
我知道javascript代码很奇怪 - 它的"正在建设中":)
当然 - 当我将此代码添加到事件记录器时,它正在工作:
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.");
在侦听器中,这将起作用:-(
相关文章:
- 分派点击事件并保留击键修饰符
- 模糊事件的Javascript测试
- keyup事件处理程序更改焦点不适用于快速键入
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 如何使Javascript动态html表及其上的事件
- 使用类从一个标记中双击事件
- 如何在未直接触发的情况下停止事件
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- 对iPad上的点击事件反应缓慢
- 事件和状态
- Fancybox是否将Click事件静音
- 主干-不管怎样,检查事件以前是否绑定过
- 从控制器返回后Ajax启动事件激发
- 如何从画布上的某个移动事件中获取X和Y
- Jquery:未触发select事件
- JsFiddle上的鼠标事件不起作用
- 只覆盖箭头键滚动事件
- $window.ga在AngularJS事件中未定义
- Atmosphere Java Servlet Server 发送事件
- Node JS HTTP Server request.on('data') 事件失败