pub_sub 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source :rubygems
2
+
3
+ # Specify your gem's dependencies in pub_sub.gemspec
4
+ gemspec
data/README.rdoc ADDED
@@ -0,0 +1,9 @@
1
+ = pub_sub
2
+
3
+ Minimal client lib for RabbitMQ publisher/subscriber.
4
+
5
+ == Copyright
6
+
7
+ Copyright (c) 2012 Simon Horne. See LICENSE.txt for
8
+ further details.
9
+
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
data/lib/pub_sub.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'bunny'
2
+ require "pub_sub/version"
3
+ require "pub_sub/bunny_config"
4
+ require "pub_sub/publisher"
5
+ require "pub_sub/fanout_publisher"
6
+ require "pub_sub/subscriber"
7
+
8
+ module PubSub
9
+ # Your code goes here...
10
+ end
@@ -0,0 +1,16 @@
1
+ module PubSub
2
+ module BunnyConfig
3
+ def bunny_config
4
+ defaults = {
5
+ :host => 'localhost',
6
+ :port => 5672,
7
+ :user => 'guest',
8
+ :pass => 'guest',
9
+
10
+ :spec => '09',
11
+ :heartbeat => 60
12
+ }
13
+ defined?(BUNNY_CONFIG) ? defaults.merge(BUNNY_CONFIG) : defaults
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,59 @@
1
+ module PubSub
2
+ module FanoutPublisher
3
+ include BunnyConfig
4
+
5
+ RETRY_WAIT = 5
6
+
7
+ def logger=(logger)
8
+ @logger = logger
9
+ end
10
+
11
+ def logger
12
+ @logger ||= begin
13
+ logger = Logger.new(STDOUT)
14
+ logger.level = Logger::WARN
15
+ logger
16
+ end
17
+ end
18
+
19
+ def bunny
20
+ @bunny ||= begin
21
+ logger.info("PubSub:FanoutPublisher#bunny: initializing and starting new bunny instance")
22
+
23
+ b = Bunny.new(bunny_config)
24
+ b.start
25
+ b
26
+ end
27
+ end
28
+
29
+ def publish(msg, exchange_name)
30
+ begin
31
+
32
+ begin
33
+ exchange = bunny.exchange(exchange_name, :type => :fanout, :durable => true)
34
+ rescue StandardError, Timeout::Error => error
35
+ logger.info("PubSub:FanoutPublisher#publish: resetting and reconnecting to #{exchange_name}, because - #{error}")
36
+ sleep RETRY_WAIT
37
+ reset
38
+ retry
39
+ end
40
+
41
+ # non-persistent to a fanout exchange
42
+ exchange.publish(msg)
43
+
44
+ rescue StandardError, Timeout::Error => error
45
+ logger.info("PubSub:FanoutPublisher#publish: error encountered while publishing to #{exchange_name} with routing_key #{routing_key}, retrying - #{error}")
46
+ sleep RETRY_WAIT
47
+ reset
48
+ retry
49
+ end
50
+ end
51
+
52
+ def reset
53
+ logger.info("PubSub:FanoutPublisher#reset: stopping bunny")
54
+
55
+ @bunny.stop rescue nil
56
+ @bunny = nil
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,73 @@
1
+ module PubSub
2
+ module Publisher
3
+ include BunnyConfig
4
+
5
+ RETRY_WAIT = 5
6
+
7
+ def logger=(logger)
8
+ @logger = logger
9
+ end
10
+
11
+ def logger
12
+ @logger ||= begin
13
+ logger = Logger.new(STDOUT)
14
+ logger.level = Logger::WARN
15
+ logger
16
+ end
17
+ end
18
+
19
+ def transactional=(transactional)
20
+ @transactional=transactional
21
+ end
22
+
23
+ def bunny
24
+ @bunny ||= begin
25
+ logger.info("PubSub:Publisher#bunny: initializing and starting new bunny instance")
26
+
27
+ b = Bunny.new(bunny_config)
28
+ b.start
29
+
30
+ if(@transactional)
31
+ logger.info("PubSub:Publisher#bunny: publisher is transactional, calling tx_select")
32
+ b.tx_select
33
+ end
34
+
35
+ b
36
+ end
37
+ end
38
+
39
+ def publish(msg, exchange_name, routing_key)
40
+ begin
41
+
42
+ begin
43
+ exchange = bunny.exchange(exchange_name, :type => :topic, :durable => true)
44
+ rescue StandardError, Timeout::Error => error
45
+ logger.info("PubSub:Publisher#publish: resetting and reconnecting to #{exchange_name}, because - #{error}")
46
+ sleep RETRY_WAIT
47
+ reset
48
+ retry
49
+ end
50
+
51
+ exchange.publish(msg, :key => routing_key, :persistent => true)
52
+
53
+ if(@transactional)
54
+ logger.debug("PubSub:Publisher#bunny: publisher is transactional, calling tx_commit")
55
+ bunny.tx_commit
56
+ end
57
+
58
+ rescue StandardError, Timeout::Error => error
59
+ logger.info("PubSub:Publisher#publish: error encountered while publishing to #{exchange_name} with routing_key #{routing_key}, retrying - #{error}")
60
+ sleep RETRY_WAIT
61
+ reset
62
+ retry
63
+ end
64
+ end
65
+
66
+ def reset
67
+ logger.info("PubSub:Publisher#reset: stopping bunny")
68
+
69
+ @bunny.stop rescue nil
70
+ @bunny = nil
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,62 @@
1
+ module PubSub
2
+ module Subscriber
3
+ include BunnyConfig
4
+
5
+ RETRY_WAIT = 5
6
+
7
+ def logger=(logger)
8
+ @logger = logger
9
+ end
10
+
11
+ def logger
12
+ @logger ||= begin
13
+ logger = Logger.new(STDOUT)
14
+ logger.level = Logger::WARN
15
+ logger
16
+ end
17
+ end
18
+
19
+ def queue_name=(queue_name)
20
+ @queue_name = queue_name
21
+ end
22
+
23
+ def bunny
24
+ @bunny ||= begin
25
+ logger.info("PubSub:Subscriber#bunny: initializing and starting new bunny instance")
26
+
27
+ b = Bunny.new(bunny_config)
28
+ b.start
29
+ b.qos
30
+ b
31
+ end
32
+ end
33
+
34
+ def reset
35
+ logger.info("PubSub:Subscriber#reset: unsubscribing from queue and stopping bunny")
36
+
37
+ @queue.unsubscribe rescue nil
38
+ @queue = nil
39
+ @bunny.stop rescue nil
40
+ @bunny = nil
41
+ end
42
+
43
+ # simple subsciption loop on a durable queue, automatic acks
44
+ # creates the queue if it does not already exist
45
+ def subscribe(&block)
46
+ raise "queue_name must be set before calling subscribe" unless @queue_name
47
+
48
+ logger.info("PubSub:Subscriber#subscribe: subscribing to queue - #{@queue_name}")
49
+ begin
50
+ @queue = bunny.queue(@queue_name, :durable => true)
51
+ @queue.subscribe(:ack => true) do |msg|
52
+ block.call(msg)
53
+ end
54
+ rescue StandardError, Timeout::Error => error
55
+ logger.info("PubSub:Subscriber: error encountered while subscribing to #{@queue_name}, retrying - #{error}")
56
+ sleep RETRY_WAIT
57
+ reset
58
+ retry
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,3 @@
1
+ module PubSub
2
+ VERSION = "0.0.1"
3
+ end
data/pub_sub.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "pub_sub/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "pub_sub"
7
+ s.version = PubSub::VERSION
8
+ s.authors = ["Simon Horne"]
9
+ s.email = ["simon@soulware.co.uk"]
10
+ s.homepage = ""
11
+ s.summary = %q{Minimal Publisher/Subscriber}
12
+ s.description = %q{Minimal Publisher/Subscriber}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+
19
+ # specify any dependencies here; for example:
20
+ # s.add_development_dependency "rspec"
21
+ # s.add_runtime_dependency "rest-client"
22
+
23
+ s.add_development_dependency "rake"
24
+
25
+ s.add_runtime_dependency "bunny", ["= 0.7.8"]
26
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pub_sub
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Simon Horne
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-03-30 00:00:00 -04:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rake
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: bunny
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - "="
42
+ - !ruby/object:Gem::Version
43
+ hash: 19
44
+ segments:
45
+ - 0
46
+ - 7
47
+ - 8
48
+ version: 0.7.8
49
+ type: :runtime
50
+ version_requirements: *id002
51
+ description: Minimal Publisher/Subscriber
52
+ email:
53
+ - simon@soulware.co.uk
54
+ executables: []
55
+
56
+ extensions: []
57
+
58
+ extra_rdoc_files: []
59
+
60
+ files:
61
+ - .gitignore
62
+ - Gemfile
63
+ - README.rdoc
64
+ - Rakefile
65
+ - lib/pub_sub.rb
66
+ - lib/pub_sub/bunny_config.rb
67
+ - lib/pub_sub/fanout_publisher.rb
68
+ - lib/pub_sub/publisher.rb
69
+ - lib/pub_sub/subscriber.rb
70
+ - lib/pub_sub/version.rb
71
+ - pub_sub.gemspec
72
+ has_rdoc: true
73
+ homepage: ""
74
+ licenses: []
75
+
76
+ post_install_message:
77
+ rdoc_options: []
78
+
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 0
89
+ version: "0"
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ hash: 3
96
+ segments:
97
+ - 0
98
+ version: "0"
99
+ requirements: []
100
+
101
+ rubyforge_project:
102
+ rubygems_version: 1.3.7
103
+ signing_key:
104
+ specification_version: 3
105
+ summary: Minimal Publisher/Subscriber
106
+ test_files: []
107
+