Вещание подгруппе подписчиков в атмосфере - PullRequest
2 голосов
/ 26 августа 2011

Что я пытаюсь сделать: иметь возможность подписки пользователей на несколько разных «комнат чата» и использовать обратную AJAX / комету для отправки сообщений из комнаты чата всем, кто вошел в эту комнату.(немного сложнее, но это похожий вариант использования).

Что я делаю: Использование Grails с JMS и AtmosphereКогда сообщение отправляется, я использую JMS для отправки объекта сообщения, полученного службой Grails, который затем транслируется на URL атмосферы (т. Е. Атмосфера / сообщения).

Очевидно, что JMS немного избыточенно я мог бы использовать его, чтобы помочь мне отфильтровать, кто должен получить сообщение, хотя на самом деле это не выглядит так, как будто оно будет работать (учитывая, что подписчик - это в основном одноразовая служба ...).

В любом случаечто мне нужно сделать, это только отправить сообщение нужной группе людей, слушающих атмосферу / сообщения.URL-адрес типа RESTful здесь будет идеальным (т. Е. Атмосфера / messages / *, где * - идентификатор комнаты), однако я понятия не имею, как сделать это с Atmosphere.

Любые идеи / предложения о том, как я могу достичьчто я хочу?Здесь нет ничего конкретного, так что не стесняйтесь предлагать почти все.Я даже думал (основываясь на ответе на другой вопрос), например, могу ли я сделать что-то вроде отправки сообщений на сервер Node.js и обработать обратную часть AJAX / кометы.

Ответы [ 3 ]

5 голосов
/ 26 августа 2011

Если я правильно понимаю ваши требования, должно работать следующее (jax-rs + scala code):

1) Каждый, кто хочет получать сообщения из чата, регистрируется на него:

@GET
@Path(choose/a/path)
def register(@QueryParam("chatroomId") chatroomId: Broadcaster) {
  // alternatively, the Suspend annotation can be used
  new SuspendResponse.SuspendResponseBuilder[String]()
          .resumeOnBroadcast(false).broadcaster(chatroomId).scope(SCOPE.REQUEST)
          .period(suspendTimeout, TimeUnit.MINUTES)
          .addListener(new AtmosphereEventsLogger()).build
}

2) Чтобы отправить сообщение всем зарегистрированным пользователям, позвоните по следующему методу:

@POST
@Broadcast
@Path(choose/a/path/{chatroomId})
def broadcast(@PathParam("chatroomId") id: String) {
  // first find your broadcaster with the BroadcasterFactory
  BroadcasterFactory.getDefault().lookupAll() // or maybe there is a find by id?
  broadcaster = ...
  broadcaster.broadcast(<your message>)
}

Я также рекомендую прочитать документ Атмосфера , взгляните на список рассылки и Блог Жанфрансуа Аркана .

Надеюсь, это поможет.

2 голосов
/ 26 августа 2011

Существует неверное понимание концепции кометы.Это просто еще одна реализация публикации / подписки.Если у вас есть несколько чатов, то вам нужно иметь несколько «тем», то есть несколько каналов, на которые пользователь может зарегистрироваться.Например:

broadcaster['/atmosphere/chatRoom1'].broadcast('Hello world!')

broadcaster['/atmosphere/chatRoom2'].broadcast('Hello world!')

Так что я бы предложил вам создать несколько каналов и не фильтровать вручную группу пользователей, которая должна получать сообщения (что, безусловно, не так, как это должно быть сделано).Вам не нужно ничего создавать на стороне сервера, так как пользователь просто зарегистрируется на определенном канале и получит сообщения, которые кто-либо помещает в него.

0 голосов
/ 25 сентября 2012

Я бы порекомендовал вам создать AtmosphereHandler для одного URL-адреса, такого как / атмосфера / чат, а затем использовать AtmosphereResource и связать с ним BroadcastFilter, скажем, назвать его ChatRoomBroadcastFilter.

Каждый раз, когда пользователь подписывается на новую комнату чата, на сервер (от клиента) отправляется сообщение, информирующее сервер о подписке. После подписки ведите список пользователей <> привязок чата где-нибудь на сервере.

Всякий раз, когда сообщение транслируется, передайте его с идентификатором чата. В ChatRoomBroadcastFilter (вам, вероятно, нужно сделать это PerRequestBroacastFilter) распространять сообщение для пользователя, только если пользователь подписался на комнату чата. Я не уверен, очищает ли это это. Если вам нужен пример кода, пожалуйста, укажите в комментариях. Я поставлю это, но для этого нужно время, так что сейчас не стоит;).

...