覚書: Rails: Action Cable の PostgreSQLアダプタ
Action Cable の PostgreSQLアダプタのコードを読んで NOTIFY/LISTEN/UNLISTEN を使用していることを知りました。対象は Rails 7.0.5 になります。
PostgreSQL クラスは Base クラスを継承している。
module ActionCable
module SubscriptionAdapter
class PostgreSQL < Base # :nodoc:
Base クラスを確認する。
https://github.com/rails/rails/blob/v7.0.5/actioncable/lib/action_cable/subscription_adapter/base.rb
def initialize(server)
def broadcast(channel, payload)
def subscribe(channel, message_callback, success_callback = nil)
def unsubscribe(channel, message_callback)
def shutdown
def identifier
initialize と identifier 以外は raise NotImplementedError を返す。派生クラスで実装する。
def broadcast(channel, payload)
raise NotImplementedError
end
identifier は次の通り。設定値がなければプロセスIDを使った文字列を返す。
def identifier
@server.config.cable[:id] ||= "ActionCable-PID-#{$$}"
end
PostgreSQL クラスに戻る。
オーバライドしたメソッドで PostgreSQL の NOTIFY/LISTEN/UNLISTEN を使用している。
listener メソッドは、SubscriberMap クラスを継承した Listener クラスを返す。
private
def listener
@listener || @server.mutex.synchronize { @listener ||= Listener.new(self, @server.event_loop) }
end
class Listener < SubscriberMap
module ActionCable
module SubscriptionAdapter
class SubscriberMap
def initialize
@subscribers = Hash.new { |h, k| h[k] = [] }
@sync = Mutex.new
end
以上です。
この記事が気に入ったらサポートをしてみませんか?