Grails 在大气中向一部分用户广播

Grails 在大气中向一部分用户广播,grails,comet,reverse-ajax,atmosphere,Grails,Comet,Reverse Ajax,Atmosphere,我想做的是: 能够让用户订阅多个不同的“聊天室”,并使用反向AJAX/comet从聊天室向登录该聊天室的所有人发送消息。(有点复杂,但这是一个类似的用例) 我在做什么: 将Grails与JMS和Atmosphere一起使用。发送消息时,我使用JMS发送消息对象,该对象由Grails服务接收,然后广播到大气URL(即大气/消息) 显然JMS有点多余,但是我想我可以用它来帮助我筛选应该检索消息的人,尽管这看起来不太管用(假设订阅者基本上是一个单例服务…) 无论如何,我需要能够做的只是向收听氛围/信息

我想做的是: 能够让用户订阅多个不同的“聊天室”,并使用反向AJAX/comet从聊天室向登录该聊天室的所有人发送消息。(有点复杂,但这是一个类似的用例)

我在做什么: 将Grails与JMS和Atmosphere一起使用。发送消息时,我使用JMS发送消息对象,该对象由Grails服务接收,然后广播到大气URL(即大气/消息)

显然JMS有点多余,但是我想我可以用它来帮助我筛选应该检索消息的人,尽管这看起来不太管用(假设订阅者基本上是一个单例服务…)

无论如何,我需要能够做的只是向收听氛围/信息的正确人群发送一条信息。RESTful类型的URL在这里是完美的(即大气/messages/*其中*是房间ID),但是我不知道如何使用大气做到这一点


关于如何实现我想要的目标,有什么想法/建议吗?这里没有什么是具体的,所以请随便提出任何建议。我甚至一直在思考(基于对另一个问题的回答),例如,如果我可以做一些事情,比如向Node.js服务器发送消息,并让它处理反向AJAX/comet部分。

如果我正确理解您的需求,以下应该可以工作(jax rs+scala代码):

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>)
}
@POST
@广播
@路径(选择/a/Path/{chatroomId})
def广播(@PathParam(“聊天室id”)id:String){
//首先在广播工厂找到您的广播公司
BroadcasterFactory.getDefault().lookupAll()//或者可能存在按id查找?
广播员=。。。
广播员
}
我还建议阅读,看看和


希望能有所帮助。

对彗星的概念有误解。这只是另一个发布/订阅实现。如果您有多个聊天室,那么您需要有多个“主题”,即用户可以注册到的多个频道。例如:

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

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

因此,我建议您使用creaet多个通道,而不是手动筛选用户集,用户集应该检索消息(这绝对不是应该采用的方式)。您不需要在服务器端创建任何内容,因为用户只需注册特定的频道并接收任何人输入的消息

我建议您为一个URL创建一个AtmosphereHandler,如/atmospher/chat room,然后使用AtmosphereSource并用它绑定一个BroadcastFilter,比如说命名为ChatRoomBroadcastFilter

每当用户订阅一个新的聊天室时,就会向服务器(从客户端)发送一条消息,告知服务器有关订阅的信息。订阅后,在服务器上某处维护用户聊天室绑定列表


每当广播消息时,请使用聊天室id进行广播。ChatRoomBroadcastFilter中的(您可能需要将其设置为PerRequestBroacastFilter)仅当用户订阅聊天室时才将消息传播给用户。我不确定这是否能解决问题。如果您需要代码示例,请在注释中提及。我会把它放进去,但那需要一些时间,所以我现在不放;)

仅供参考:这种技术通常被称为(与反向ajax相反),所以这些通道可以动态生成?在中,我不必为每个通道都设置句柄?是服务器上的一种方法,我需要在其中写出订阅该通道的客户端将收到的响应。要做到这一点,我需要为该通道设置一个处理程序。我可能需要的是能够有一个通配符处理程序方法(即以“/atmosphere/chatRoomX”的形式为所有频道提供服务器,其中X=聊天室id)。