行动电缆:如何传递错过的聊天消息

Posted

技术标签:

【中文标题】行动电缆:如何传递错过的聊天消息【英文标题】:Action Cable: How to deliver missed chat messages 【发布时间】:2016-12-17 22:44:04 【问题描述】:

有什么好的方法可以在聊天中传递错过的消息,例如使用 Action Cable?就像当您关闭笔记本电脑并再次打开它时,您并没有重新加载页面,但您可能错过了消息

一种方法是使用Action Cable 进行AJAX 调用,但随后我将不得不复制您收到消息时发生的一些逻辑。如果可能的话,我想重复使用 Action Cable

【问题讨论】:

包括你的一些动作cable JS。 【参考方案1】:

当然将它们存储在数据库中。并在您每次重新订阅 Action Cable 时从数据库中加载它们。

【讨论】:

为什么要投反对票?否则你不可能这样做。【参考方案2】:

我假设您已经看到(read_at timestamp)每条消息的状态,并且您的 web-socket 没有关闭(关闭笔记本电脑或关闭浏览器会关闭它)。

我会创建后台任务来检查所有订阅频道是否有未见消息。 假设您有用户订阅的频道“message_234”,并且那里有一些消息,其中 read_at 在您的表中为零。然后使用您的后台任务将它们广播给您的用户。 将超时设置为 1 天以不使其超载并对您的 message_notification 通道执行相同操作。

【讨论】:

【参考方案3】:

您可以使用#transmit#subscribed 中发送过去的消息。

不幸的是,这种方便的方法几乎没有记录,也没有在当前的edge guide for Action Cable 中提及。但应该在引入 Action Cable 后的所有版本中都可以使用。

这是一个例子:

def subscribed
  lobby = Lobby.find(params[:lobby])
  stream_from(stream_name)
  lobby.messages.order(created_at: :asc).each do |message|
    transmit(message.to_json)
  end
end

【讨论】:

以上是关于行动电缆:如何传递错过的聊天消息的主要内容,如果未能解决你的问题,请参考以下文章

从 ejabberd 检索聊天记录时如何识别已发送和未发送的消息?

如何在 Google AppEngine 上实现“实时”消息传递?

除聊天文本外的 Smack 消息传递客户端

使用 GCM 的 Android 聊天应用程序如何工作?

如何在消息传递 xmpp 框架中发送图像?

如何实现android到IOS之间的wifi聊天