我有一个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
消息 问题
- 如果用户在一个浏览器中关闭选项卡,所有其他选项卡仍应接收数据,这不是一个有效的用例吗?
- 你看到我在做什么有任何错误/问题吗?
- 我该如何解决这个问题?
由于
答案 0 :(得分:0)
而不是使用
s.getBasicRemote().sendText(TwitterHoseBird.getMsgQueue().take());
将其更改为
s.getAsyncRemote().sendText(TwitterHoseBird.getMsgQueue().take());
其他一切都会很好地锻炼