我按官方实例写聊天室,然后想实现掉线重连后获取错过的数据,是不是只能刷新页面,有没有不刷新而是重新推送错过的信息。
自己顶
短线重连得在客户端做,类似 timer,不错过消息可以持久化消息,简单 mark read or unread.
这需要一种建立一种机制,客户端收到消息后回执,标注过的消息从队列中删除,客户端上线(subscribed)后触发(未标示)队列。
# -*- encoding: utf-8 -*- class NotificationsChannel < ApplicationCable::Channel def subscribed stop_all_streams stream_from channel_id count # 连接后可触发 end def unsubscribed stop_all_streams end def speak(data) ActionCableWorker.perform_async(channel_id, data) # Sidekiq 任务 end def count speak( message: "当前连接数: #{ActionCable.server.connections.count}" ) end private def channel_id "notifications:#{self.user_id || 'public'}" end end
坐等答案,我也在玩 ActionCable
ActionCable 前端部分已经自己实现了断线重连。楼主的这个问题属于业务范畴,这需要你自己去构建一套机制来保证客户端能够收到所有它未拿到的消息,2 楼 3 楼都提供了思路。