eventbus 0.0.21 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,70 @@
1
+
2
+ require 'amqp'
3
+
4
+ module AMQPConnectionDriver
5
+
6
+
7
+ def connection_driver_initialize
8
+ puts "AMQPConnectionDriver is loaded!"
9
+ end
10
+
11
+ def get_connection
12
+ new_opts = {
13
+ :vhost => ENV["BROKER_VHOST"] || "eventbus",
14
+ :host => ENV["BROKER_HOST"] || "localhost",
15
+ :port => ENV["BROKER_PORT"] || 5672,
16
+ :user => ENV["BROKER_USER"] || "eventbus",
17
+ :pass => ENV["BROKER_PASS"] || "eventbus",
18
+ # :logging => opts.delete(:logging) || false,
19
+ #:logfile => opts.delete(:logfile) || STDOUT
20
+ }
21
+
22
+ return AMQP.connect(new_opts)
23
+
24
+ end
25
+
26
+ def send_raw(content, opts = {})
27
+ queue_name = opts.delete(:queue_name)
28
+ EventMachine.run do
29
+ client = get_connection
30
+ channel = AMQP::Channel.new(client)
31
+
32
+ exchange = channel.direct('eventbus', :durable => true,
33
+ :persistent => true, :immediate => false,
34
+ :auto_delete => false)
35
+
36
+ puts "Declaring queue: #{queue_name}"
37
+ q = channel.queue(queue_name, :durable => true, :persistent => true, :immediate => false, :auto_delete => false)
38
+ q.bind(exchange, :routing_key => queue_name)
39
+
40
+ puts "Sending message..."
41
+ exchange.publish(content, :routing_key => queue_name) do
42
+ puts "Published to #{queue_name}: #{content}"
43
+ client.close { EventMachine.stop }
44
+ end
45
+ end
46
+ end
47
+
48
+ def watch_queue(listen_queue)
49
+ EventMachine.run do
50
+ client = get_connection
51
+ channel = AMQP::Channel.new(client)
52
+
53
+ @logger.info "Listening on #{listen_queue}"
54
+
55
+ exchange = channel.direct('eventbus', :durable => true,
56
+ :persistent => true, :immediate => false,
57
+ :auto_delete => false)
58
+
59
+ q = channel.queue(listen_queue, :durable => true, :persistent => true, :immediate => false, :auto_delete => false)
60
+
61
+
62
+ q.bind(exchange, :routing_key => listen_queue)
63
+
64
+ q.subscribe do |headers, payload|
65
+ yield payload
66
+ end
67
+
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,71 @@
1
+ # BunnyConnectionDriver is the original implementation of
2
+ # the AMQP-based broker. I am trying to make this work with
3
+ # straight Ruby AMQP driver, but this one is the default
4
+ # until I get that working properly.
5
+
6
+ module BunnyConnectionDriver
7
+
8
+ @@BunnyConnector_Connection = nil
9
+
10
+ def connection_driver_initialize
11
+ puts "BunnyConnectionDriver is loaded!"
12
+ end
13
+
14
+ def get_connection
15
+ if @@BunnyConnector_Connection.nil?
16
+ new_opts = {
17
+ :vhost => ENV["BROKER_VHOST"] || "eventbus",
18
+ :host => ENV["BROKER_HOST"] || "localhost",
19
+ :port => ENV["BROKER_PORT"] || 5672,
20
+ :user => ENV["BROKER_USER"] || "eventbus",
21
+ :pass => ENV["BROKER_PASS"] || "eventbus",
22
+ # :logging => opts.delete(:logging) || false,
23
+ #:logfile => opts.delete(:logfile) || STDOUT
24
+ }
25
+
26
+ @@BunnyConnector_Connection = Bunny.new(new_opts)
27
+ @@BunnyConnector_Connection.start
28
+ end
29
+
30
+ return @@BunnyConnector_Connection
31
+
32
+ end
33
+
34
+ def send_raw(content, opts = {})
35
+ queue_name = opts.delete(:queue_name)
36
+ client = get_connection
37
+
38
+ exchange = client.exchange('eventbus', :durable => true, :persistent => true, :immediate => false)
39
+
40
+ puts "Declaring queue: #{queue_name}"
41
+ q = client.queue(queue_name, :durable => true, :persistent => true, :immediate => false)
42
+ q.bind('eventbus', :key => queue_name)
43
+
44
+ puts "Publishing content to #{queue_name}: #{content}"
45
+ exchange.publish(content, :key => queue_name)
46
+ puts "Done!"
47
+
48
+ end
49
+
50
+ def watch_queue(listen_queue)
51
+
52
+ b = get_connection
53
+
54
+ @logger.info "Listening on #{listen_queue}"
55
+
56
+ exchange = b.exchange('eventbus', :durable => true, :persistent => true, :immediate => false)
57
+
58
+ q = b.queue(listen_queue, :durable => true, :persistent => true, :immediate => false)
59
+ q.bind(exchange, :key => listen_queue)
60
+
61
+ q.pop do |msg|
62
+ if msg[:delivery_details].nil?
63
+ # Gotta figure out why this is necessary. Blech.
64
+ sleep 0.25
65
+ else
66
+ yield msg[:payload]
67
+ end
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,77 @@
1
+ # This module is primarily intended for use with ActiveMQ, though
2
+ # it should work with any Stomp-speaking broker.
3
+ require 'stomp'
4
+ module StompConnectionDriver
5
+
6
+ @@StompConnector_Connection = nil
7
+
8
+ def connection_driver_initialize
9
+ puts "StompConnectionDriver is loaded!"
10
+ end
11
+
12
+ def get_connection
13
+ if @@StompConnector_Connection.nil?
14
+ opts = {
15
+ :host => ENV["BROKER_HOST"] || "localhost",
16
+ :port => ENV["BROKER_PORT"] || 61613,
17
+ :user => ENV["BROKER_USER"],
18
+ :pass => ENV["BROKER_PASS"],
19
+ # :logging => opts.delete(:logging) || false,
20
+ #:logfile => opts.delete(:logfile) || STDOUT
21
+ }
22
+
23
+ stomp_url = ENV['STOMP_URL'] ||
24
+ "stomp://#{opts[:user]}:#{opts[:pass]}@#{opts[:host]}:#{opts[:port]}?initialReconnectDelay=5000&randomize=false&useExponentialBackOff=false"
25
+ @@StompConnector_Connection = Stomp::Client.new(stomp_url)
26
+ end
27
+
28
+ return @@StompConnector_Connection
29
+
30
+ end
31
+
32
+ # opts basically just gets passed to the Stomp client.send, so it can be things
33
+ # like :persistent => false, etc. :persistent is true by default.
34
+ def send_raw(content, opts = {})
35
+
36
+ queue_name = opts.delete(:queue_name)
37
+ queue_name = "/queue/#{queue_name}"
38
+
39
+ opts[:persistent] = true if opts[:persistent].nil?
40
+
41
+ # "Fix" an ActiveMQ "bug" where it assumes that any message with a content-length
42
+ # header is a bytes-message instead of a text message. This behavior prevents the
43
+ # message conent from showing up in the "Message Details" section when you try
44
+ # to view the message in ActiveMQ's admin interface.
45
+ #
46
+ # Note that the *correct* behavior is the opposite of this: All Stomp messages
47
+ # are recommended to include content-length. However, this is the *less annoying*
48
+ # and *more useful* behavior.
49
+ opts[:suppress_content_length] = true if opts[:suppress_content_length].nil?
50
+
51
+ puts "Stomp sending message to: #{queue_name}"
52
+
53
+ client = get_connection
54
+ client.publish(queue_name, content, opts)
55
+
56
+ end
57
+
58
+ def watch_queue(listen_queue)
59
+ client = get_connection
60
+
61
+ queue_name = listen_queue.match('^/') ? listen_queue : "/queue/#{listen_queue}"
62
+
63
+ # OK, so some assumption that we're using ActiveMQ here. We'll work that out eventually. The point
64
+ # is, though, that we want to allow for maximum parallelism -- not just by thread but also across
65
+ # processes and machines. Therefore, don't lock the queue exclusively (i.e. don't kill other clients!)
66
+ # and only take blocks of one message rather than claiming large blocks. These assumptions should become
67
+ # configurable at some point, but for now it's not really a concern.
68
+ puts "Subscribing to #{queue_name}..."
69
+
70
+ client.subscribe(queue_name, {"activemq.prefetchSize" => 1, "activemq.exclusive" => false}) do |msg|
71
+ yield msg.body
72
+ end
73
+
74
+
75
+ end
76
+
77
+ end
@@ -33,7 +33,7 @@ class Service
33
33
 
34
34
  driver_module = "#{@connection_driver}ConnectionDriver"
35
35
 
36
- require_relative "connectors/#{@connection_driver.downcase}"
36
+ require "eventbus/connectors/#{@connection_driver.downcase}"
37
37
 
38
38
  # Pretty much just swiped from ActiveSupport "constantize"..
39
39
  conn_module = Object.const_defined?(driver_module) ? Object.const_get(driver_module) : Object.const_missing(driver_module)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eventbus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.21
4
+ version: 0.0.22
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-29 00:00:00.000000000 Z
12
+ date: 2012-05-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bunny
16
- requirement: &9102240 !ruby/object:Gem::Requirement
16
+ requirement: &13397500 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *9102240
24
+ version_requirements: *13397500
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: amqp
27
- requirement: &9101680 !ruby/object:Gem::Requirement
27
+ requirement: &13396960 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *9101680
35
+ version_requirements: *13396960
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: stomp
38
- requirement: &9101180 !ruby/object:Gem::Requirement
38
+ requirement: &13396440 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *9101180
46
+ version_requirements: *13396440
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: uuid
49
- requirement: &9100740 !ruby/object:Gem::Requirement
49
+ requirement: &13396000 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *9100740
57
+ version_requirements: *13396000
58
58
  description: Distributed application framework for developing event-driven automations.
59
59
  email: dev.incognito@spadea.net
60
60
  executables: []
@@ -64,6 +64,9 @@ files:
64
64
  - lib/eventbus/message.rb
65
65
  - lib/eventbus/service.rb
66
66
  - lib/eventbus/queue.rb
67
+ - lib/eventbus/connectors/stomp.rb
68
+ - lib/eventbus/connectors/bunny.rb
69
+ - lib/eventbus/connectors/amqp.rb
67
70
  homepage: http://spadea.net/?page_id=8
68
71
  licenses: []
69
72
  post_install_message: