我正在使用Puma和Tubesock处理websocket消息,并希望访问处理发送消息的库文件中的已连接websocket列表。我尝试做的是检查用户是否通过websocket连接,如果不是,则通过推送通知发送消息。
用户使用包含其userid的路径连接到websocket:
# config/routes.rb
Rails.application.routes.draw do
get 'ws/:user_id', to: 'socket#ws', as: :socket
end,并在控制器中使用Tubesock。
class SocketController < ApplicationController
include Tubesock::Hijack
def ws
hijack do |tubesock|
@wsTube = tubesock
tubesock.onopen do
socket_user = User.find_by_user_id(params[:user_id])
# setup to send/receive messages through /lib/notification.rb
end
tubesock.onclose do
# cleanup when connection closes
end
end
end
end我想过在数据库中为用户添加一个属性,但我担心如果连接突然终止,比如在重启期间,那么该属性将显示为connected,而事实并非如此。理想情况下,我希望检查活动的连接,而不是在打开和关闭期间切换属性。
发布于 2015-10-13 01:35:45
考虑到你的问题,而不是你问题的标题,在我看来,只有当Tubesock#send_data返回一个真实的值时,你才应该将消息标记为“已读”。
从源代码中可以看出,如果成功,Tubesock#send_data将返回一个数字;如果失败,它将返回nil (请注意,如果websocket有onclose回调,它可能会返回一个未确定的值)。
至于在数据库中存储Tubesock套接字,这是根本不可能的,因为Tubesock包含socket对象,该对象是一个打开的文件描述符,并且不能以持久的方式存储到数据库中。
您可能应该将数据存储在本地内存中,例如Hash。
如果Tubesock支持connection的UUID,那将是一个不同的故事,它也将允许您从单个进程扩展并使用Redis……但快速浏览一下(我不是Tubesock用户),情况似乎并非如此。
https://stackoverflow.com/questions/33085808
复制相似问题