Skip to content

Instantly share code, notes, and snippets.

@samsworldofno
Last active August 29, 2015 14:03
Show Gist options
  • Save samsworldofno/eb5a69356f8b115b63f6 to your computer and use it in GitHub Desktop.
Save samsworldofno/eb5a69356f8b115b63f6 to your computer and use it in GitHub Desktop.
Simple pub/sub and fanout examples
source 'https://rubygems.org'
gem 'aws-sdk'
gem 'yaml_properties'
gem 'pry'
AWS:
access_key_id: [key id]
secret_access_key: [access key]
require 'bundler/setup'
require 'yaml_properties'
require 'aws-sdk'
AWS.config(YamlProperties.AWS)
sqs = AWS::SQS.new
sns = AWS::SNS.new
class Publisher
attr_accessor :topic
def initialize(topic: )
self.topic = topic
end
def publish(text)
puts "sending: #{text}"
topic.publish(text)
end
end
class Listener
attr_accessor :queue, :name
def initialize(queue:, name: nil)
self.name = name
self.queue = queue
end
def listen!
queue.poll do |message|
body = JSON.parse(message.body)['Message']
puts "\treceived [#{self.name}]: #{body}"
end
end
end
listener_1_queue = sqs.queues.create("sam_fanout_test-listener_1")
listener_2_queue = sqs.queues.create("sam_fanout_test-listener_2")
publisher_topic = sns.topics.create("sam_fanout_test-")
publisher_topic.subscribe(listener_1_queue)
publisher_topic.subscribe(listener_2_queue)
Thread.new do
listener = Listener.new(queue: listener_1_queue, name: 'listener 1')
listener.listen!
end
Thread.new do
listener = Listener.new(queue: listener_2_queue, name: 'listener 2')
listener.listen!
end
publisher = Publisher.new(topic: publisher_topic)
publisher.publish "hello, I am a message"
sleep 1
publisher.publish "hello, I am also message"
sleep 10
require 'bundler/setup'
require 'yaml_properties'
require 'aws-sdk'
AWS.config(YamlProperties.AWS)
sqs = AWS::SQS.new
queue = sqs.queues.create("sam_fanout_test")
class Client
attr_accessor :queue
def initialize(queue: )
self.queue = queue
end
end
class Publisher < Client
def publish(text)
puts "sending: #{text}"
queue.send_message(text)
end
end
class Listener < Client
def listen!
queue.poll do |message|
puts "\treceived: #{message.body}"
end
end
end
Thread.new do
listener = Listener.new(queue: queue)
listener.listen!
end
publisher = Publisher.new(queue: queue)
publisher.publish "hello, I am a message"
sleep 1
publisher.publish "hello, I am also message"
sleep 10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment