Skip to content

Instantly share code, notes, and snippets.

@alilosoft
Forked from chsh/pg_pub_sub.rb
Created December 23, 2020 11:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alilosoft/d124addcd21ee36bdb23b0132472fe83 to your computer and use it in GitHub Desktop.
Save alilosoft/d124addcd21ee36bdb23b0132472fe83 to your computer and use it in GitHub Desktop.
PostgreSQL LISTEN/NOTIFY example for ruby
#
# A:
# pubsub = PgPubSub.new('channelname')
# pubsub.subscribe do |data|
# puts "data: #{data} is coming!"
# end
#
# B:
# pubsub = PgPubSub.new('channelname')
# pubsub.publish("hello world")
#
# becomes
# A:
# => data: hello world is coming!
#
#
# "C" before channel name is not required.
# But when channel name starts with digit, e.g. LISTEN 1NAME
# it causes syntax error. So, it fix erorr.
#
class PgPubSub
def initialize(channel)
@channel = channel
end
def subscribe
connection.execute "LISTEN C#{@channel}"
loop do
connection.raw_connection.wait_for_notify do |event, id, data|
yield data
end
end
ensure
connection.execute "UNLISTEN C#{@channel}"
end
def publish(json)
connection.execute "NOTIFY C#{@channel}, #{connection.quote json}"
end
private
def connection
ActiveRecord::Base.connection
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment