Надеюсь, что это помогает тому, кто пытается достичь того же. Там могут быть лучшие способы сделать это. Я думаю, что мне придется использовать этот подход, пока кто-то не предложит лучшее решение.
ользую Atmosphere runtime 0.6 Snapshot. Tomcat 7 правильно регистрирует, что я использую разъем Http11 Nio, и нет никаких предупреждений, что BlockingIO будет использоваться.
Я пытаюсь отправлять сообщения на три вида каналов.
Global Broadcaster - трансляция на все приостановленные ресурсы. (Все)Трансляция на определенный ресурс (скажем, Партнер)Трансляция на текущий ресурс (Self)Когда происходит вход в систему, что все я должен хранить в сеансе, чтобы добиться такого рода трансляции?
Некоторые детали моего кода следующие:
Мой обработчик реализует 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) {<br>// this gives the partner's name<br>String partner= (String) resource.getAtmosphereConfig().getServletContext().getAttribute(name + PARTNER_NAME_TOKEN);<br>// get partner's broadcaster<br>Broadcaster outsiderBroadcaster = (Broadcaster) resource<br>.getAtmosphereConfig().getServletContext()<br>.getAttribute(partner);<br>if (outsiderBroadcaster == null) {<br>sendMessage(selfBroadcaster, "Invalid user " + partner);<br>return;<br>}<br>// broadcast to partner<br>outsiderBroadcaster.broadcast(" **" + message);
Я надеюсь, что дал всю необходимую информацию. Я могу предоставить больше информации, если требуется.
Проблема в том, что глобальное сообщение отправлено. При отправке сообщения партнеру, иногда оно блокируется, сообщение вообще не принимается клиентом. Это происходит последовательно после 3-4 сообщений.
Есть ли какая-то проблема с потоками? Что я делаю неправильно?
Я надеюсь, что кто-нибудь поможет мне с этим.