Skip to content

Instantly share code, notes, and snippets.

@kumaresan-rails
Forked from chsh/pg_pub_sub.rb
Created January 4, 2017 18:00
Show Gist options
  • Save kumaresan-rails/71d1aa7cf37e7a4c62aa9820731d0bf3 to your computer and use it in GitHub Desktop.
Save kumaresan-rails/71d1aa7cf37e7a4c62aa9820731d0bf3 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