我正在使用 Atmosphere 运行时 0.6 快照。Tomcat 7 正确记录我正在使用 Http11 Nio 连接器,并且没有警告将使用 BlockingIO。
我正在尝试将消息发送到三种渠道。
- Global Broadcaster - 向所有暂停的资源广播。(全部)
- 广播到特定资源(例如,合作伙伴)
- 广播到当前资源(自身)
当登录动作发生时,为了实现这种广播,我必须在会话中存储什么?
我的代码的一些细节如下:
- 我的处理程序实现 AtmosphereHandler
在构造函数中,我将 globalBroadcaster 实例化如下:
globalBroadcaster = new DefaultBroadcaster();
登录时,
resource.getAtmosphereConfig().getServletContext().setAttribute(name, selfBroadcaster);
其中 name 是请求参数中的用户名,selfBroadcaster 是 DefaultBroadcaster 的新实例。这是 sendMessageToPartner 的代码,
private synchronized void sendMessageToPartner(Broadcaster selfBroadcaster,
AtmosphereResource<HttpServletRequest, HttpServletResponse> resource,String name, String message) {
// this gives the partner's name
String partner= (String) resource.getAtmosphereConfig().getServletContext().getAttribute(name + PARTNER_NAME_TOKEN);
// get partner's broadcaster
Broadcaster outsiderBroadcaster = (Broadcaster) resource
.getAtmosphereConfig().getServletContext()
.getAttribute(partner);
if (outsiderBroadcaster == null) {
sendMessage(selfBroadcaster, "Invalid user " + partner);
return;
}
// broadcast to partner
outsiderBroadcaster.broadcast(" **" + message);
我希望我已经提供了所有必需的信息。如果需要,我可以提供更多信息。
问题是,全局消息被发送。当向合作伙伴发送消息时,有时它会被阻止,客户端根本不会收到消息。这在 3-4 条消息之后始终如一地发生。
有一些线程问题吗?我究竟做错了什么?
我希望有人能帮我解决这个问题。