Java 使用FCM向一组设备发送通知

Java 使用FCM向一组设备发送通知,java,firebase,firebase-cloud-messaging,Java,Firebase,Firebase Cloud Messaging,我希望能够调用这样的函数:(从客户端) 使用这样的DB结构 /userTokens/userId:userInstanceId /groupMembers/groupId/[userIds...] /serverRequests/... 现在,我在研究之后,我想我有一个关于如何接近它的想法,但是我不知道它是否是正确的方法,它是非常重要的,因为我认为这应该是一个非常简单的任务,所以我想知道是否有更简单的方法来解决我的问题。 我会这样做的 [后端] 在运行在谷歌云上的Servlet中的节点上注册C

我希望能够调用这样的函数:(从客户端)

使用这样的DB结构

/userTokens/userId:userInstanceId
/groupMembers/groupId/[userIds...]
/serverRequests/...

现在,我在研究之后,我想我有一个关于如何接近它的想法,但是我不知道它是否是正确的方法,它是非常重要的,因为我认为这应该是一个非常简单的任务,所以我想知道是否有更简单的方法来解决我的问题。 我会这样做的

[后端]

  • 在运行在谷歌云上的Servlet中的节点上注册ChildEventListener
  • [客户]

  • 推送到节点
    /serverRequests/Push/groupId:message
  • [后端]

  • 获取
    /groupMembers/groupId/
    并将用户标识保存在列表中
  • 对于每个userId,在
    /userTokens/userId
    中获取其userInstanceId并保存到列表中
  • 使用:batchAdd将每个userInstanceId订阅到主题“groupId”
  • 向主题“groupId”发送通知
  • 但我在步骤4中看到了一个问题。因为要获取userInstanceId,我必须为每个用户ID发出一个带有ValueEventListener的请求,但由于它们是异步的,我如何确定所有instanceId的下载时间?我是否将计时器设置为5秒?我是否检查用户ID列表有多大,然后在每次下载instanceId时使用LinkedBlockingQueue之类的工具发布到线程,并且只有当instanceId达到该大小时,才执行步骤5

    因为我找不到多个
    .equalTo
    查询,而且我无法下载整个userTokens节点…

    首先,我将使用它,而不是您设置的自定义侦听器。你可以看到一个例子

    接下来,我会考虑使用,因为它将覆盖您所描述的用例(向组的成员发送消息)。这是我自己用的,很有魅力

    现在,您的流程将如下所示:

    • 客户端告诉FCM它想订阅主题
      groupID

    • 在某个时刻,有一条消息被推送到您的
      /groupId/messages/
      中的一个端点(或者您想如何构造它,请记住,!)

    • 然后使用云函数收听
      /{groupId}/messages/{messageId}
      ,并将新消息发布到主题
      /groupId


    我希望这是有意义的,并且我正确理解了您的问题

    谢谢您的回答,如果没有更好的答案,我将评分接受。虽然我对javascript了解不多,但似乎我必须学习它来实现云函数解决方案,在看了它之后,它确实使事情变得更简单。(AppEngine服务器解决方案将花费大量资金)。还有一件事仍然很棘手,正如你所说的,客户要求订阅主题,因为在我的例子中,管理员可以将用户添加到组中,然后他们就不会被订阅了?或者我也要为此实现云功能吗?我不知道让管理员将人员添加到通知组是否是一种好的做法。但如果确实需要这样做,只需让客户端侦听数据库中的端点,当出现新密钥时,客户端获取密钥并订阅主题
    /userTokens/userId:userInstanceId
    /groupMembers/groupId/[userIds...]
    /serverRequests/...