JavaEE Websocket:关闭浏览器选项卡将关闭所有会话,无论浏览器如何
JavaEE Websocket: closing browser tab closes all sessions irrespective of browser
我有一个websocket端点
@ServerEndpoint("/tweets")
public class TweetStreamServer {
private static final Logger LOGGER = LoggerFactory.getLogger(TweetStreamServer.class);
@OnMessage
public void tweets(final String message, final Session session) throws IOException, InterruptedException {
System.out.println("session id:" + session.getId() + ", search term: " + message);
final Client twitterClient = TwitterHoseBird.getInstance(message);
while (!session.getOpenSessions().isEmpty()) {
for (final Session s : session.getOpenSessions()) {
if (twitterClient.isDone()) {
System.out.println("Twitter Client Done, waiting ...");
}
s.getBasicRemote().sendText(TwitterHoseBird.getMsgQueue().take());
}
}
}
}
我将其部署在WildFly 8.1.0 Final
上。然后在Chrome
, Safari
上打开多个选项卡并运行以下
var connection = new WebSocket('ws://127.0.0.1:8080/tweetstream-1.0-SNAPSHOT/tweets');
connection.onopen = function () {
connection.send('germany');
};
connection.onerror = function (error) {
console.log('WebSocket Error ' + error);
};
connection.onmessage = function (e) {
console.log('Server: ' + e.data);
};
connection.onclose = function (e) {
console.log('closing session');
};
然后所有选项卡开始接收来自服务器的数据。
- 然后,当我在其中一个选项卡上执行
connection.close();
时,只有该连接中断,而所有其他选项卡仍在接收数据 - 但是如果我关闭其中一个选项卡(在任何浏览器中),在所有其他选项卡中打开的所有会话都会关闭会话,
closing session
消息
如果用户在一个浏览器中关闭一个选项卡,所有其他选项卡应该仍然接收数据,这不是一个有效的用例吗?
-你看到我在做什么错误/问题吗?
-我该如何解决这个问题?
谢谢
不使用
s.getBasicRemote().sendText(TwitterHoseBird.getMsgQueue().take());
改为
s.getAsyncRemote().sendText(TwitterHoseBird.getMsgQueue().take());
和其他东西都可以正常运行
相关文章:
- web应用程序中的跨浏览器会话
- 每个用户/浏览器会话只加载一次Javascript
- 浏览器会话存储.在选项卡之间共享
- 在浏览器会话中保存表单数据
- 显示弹出脚本,使其在每个浏览器会话中只弹出一次
- 我们可以在浏览器会话中跨网页引用 JavaScript 变量吗?
- 保持浏览器会话持久性的地理位置
- 当有两个浏览器实例时,如何检查浏览器会话是否存在
- Chrome 标签页的永久唯一 ID,在浏览器会话之间持续存在
- 谷歌浏览器会话过期=空不起作用
- 如何显示 .toggle 或 .使用 Meteor 对所有连接的浏览器会话进行动画处理
- 检测私人浏览器会话是否在使用Javascript的Firefox上
- 如何在浏览器会话关闭后恢复客户端计时器
- 我可以公开访问浏览器会话吗
- 每个浏览器会话弹出cookie一次
- Openerp浏览器会话注销
- 每个浏览器会话运行一次脚本,但在结束时冻结脚本
- 如何使beforeunload事件仅在浏览器会话退出时触发?
- Firebase:限制创建它的浏览器会话的子会话's写访问
- 使用jquery销毁当前url的浏览器会话