eventbus 0.0.20

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.
Files changed (110) hide show
  1. data/admin/Gemfile +50 -0
  2. data/admin/Gemfile.lock +141 -0
  3. data/admin/Rakefile +7 -0
  4. data/admin/app/assets/images/rails.png +0 -0
  5. data/admin/app/assets/javascripts/application.js +15 -0
  6. data/admin/app/assets/javascripts/applications.js.coffee +3 -0
  7. data/admin/app/assets/javascripts/message_routes.js.coffee +3 -0
  8. data/admin/app/assets/javascripts/message_types.js.coffee +3 -0
  9. data/admin/app/assets/javascripts/messages.js.coffee +3 -0
  10. data/admin/app/assets/stylesheets/application.css +13 -0
  11. data/admin/app/assets/stylesheets/applications.css.scss +3 -0
  12. data/admin/app/assets/stylesheets/global.css.scss +72 -0
  13. data/admin/app/assets/stylesheets/message_routes.css.scss +3 -0
  14. data/admin/app/assets/stylesheets/message_types.css.scss +3 -0
  15. data/admin/app/assets/stylesheets/messages.css.scss +30 -0
  16. data/admin/app/assets/stylesheets/scaffolds.css.scss +56 -0
  17. data/admin/app/controllers/application_controller.rb +3 -0
  18. data/admin/app/controllers/applications_controller.rb +83 -0
  19. data/admin/app/controllers/message_routes_controller.rb +85 -0
  20. data/admin/app/controllers/message_types_controller.rb +83 -0
  21. data/admin/app/controllers/messages_controller.rb +75 -0
  22. data/admin/app/helpers/application_helper.rb +2 -0
  23. data/admin/app/helpers/applications_helper.rb +2 -0
  24. data/admin/app/helpers/message_routes_helper.rb +2 -0
  25. data/admin/app/helpers/message_types_helper.rb +2 -0
  26. data/admin/app/helpers/messages_helper.rb +2 -0
  27. data/admin/app/models/application.rb +7 -0
  28. data/admin/app/models/message.rb +4 -0
  29. data/admin/app/models/message_route.rb +5 -0
  30. data/admin/app/models/message_type.rb +7 -0
  31. data/admin/app/views/applications/_form.html.haml +27 -0
  32. data/admin/app/views/applications/edit.html.haml +5 -0
  33. data/admin/app/views/applications/index.html.haml +28 -0
  34. data/admin/app/views/applications/new.html.haml +3 -0
  35. data/admin/app/views/applications/show.html.haml +16 -0
  36. data/admin/app/views/layouts/application.html.haml +24 -0
  37. data/admin/app/views/message_routes/_form.html.haml +31 -0
  38. data/admin/app/views/message_routes/edit.html.haml +5 -0
  39. data/admin/app/views/message_routes/index.html.haml +28 -0
  40. data/admin/app/views/message_routes/new.html.haml +3 -0
  41. data/admin/app/views/message_routes/show.html.haml +16 -0
  42. data/admin/app/views/message_types/_form.html.haml +29 -0
  43. data/admin/app/views/message_types/edit.html.haml +5 -0
  44. data/admin/app/views/message_types/index.html.haml +28 -0
  45. data/admin/app/views/message_types/new.html.haml +5 -0
  46. data/admin/app/views/message_types/show.html.haml +17 -0
  47. data/admin/app/views/messages/index.html.haml +48 -0
  48. data/admin/app/views/messages/show.html.haml +45 -0
  49. data/admin/config/application.rb +64 -0
  50. data/admin/config/boot.rb +6 -0
  51. data/admin/config/database.yml +29 -0
  52. data/admin/config/environment.rb +5 -0
  53. data/admin/config/environments/development.rb +37 -0
  54. data/admin/config/environments/production.rb +72 -0
  55. data/admin/config/environments/test.rb +37 -0
  56. data/admin/config/initializers/backtrace_silencers.rb +7 -0
  57. data/admin/config/initializers/inflections.rb +15 -0
  58. data/admin/config/initializers/mime_types.rb +5 -0
  59. data/admin/config/initializers/secret_token.rb +7 -0
  60. data/admin/config/initializers/session_store.rb +8 -0
  61. data/admin/config/initializers/wrap_parameters.rb +14 -0
  62. data/admin/config/locales/en.yml +5 -0
  63. data/admin/config/routes.rb +69 -0
  64. data/admin/config.ru +4 -0
  65. data/admin/db/development.sqlite3-journal +0 -0
  66. data/admin/db/migrate/20120218124300_create_messages.rb +16 -0
  67. data/admin/db/migrate/20120219021535_create_applications.rb +11 -0
  68. data/admin/db/migrate/20120219021806_create_message_types.rb +13 -0
  69. data/admin/db/migrate/20120219021940_create_message_routes.rb +13 -0
  70. data/admin/db/migrate/20120411001040_add_app_id_key_msg_type_id_to_messages.rb +7 -0
  71. data/admin/db/migrate/20120411001823_rename_message_type_to_message_type_name_in_messages.rb +5 -0
  72. data/admin/db/migrate/20120413024953_add_message_guid_to_messages.rb +5 -0
  73. data/admin/db/migrate/20120523112257_add_match_all_errors_to_routes.rb +5 -0
  74. data/admin/db/schema.rb +68 -0
  75. data/admin/db/seeds.rb +7 -0
  76. data/admin/doc/README_FOR_APP +2 -0
  77. data/admin/public/404.html +26 -0
  78. data/admin/public/422.html +26 -0
  79. data/admin/public/500.html +25 -0
  80. data/admin/public/favicon.ico +0 -0
  81. data/admin/public/robots.txt +5 -0
  82. data/admin/script/rails +6 -0
  83. data/admin/script/railsrunner +3 -0
  84. data/admin/test/fixtures/applications.yml +14 -0
  85. data/admin/test/fixtures/message_routes.yml +11 -0
  86. data/admin/test/fixtures/message_types.yml +17 -0
  87. data/admin/test/fixtures/messages.yml +45 -0
  88. data/admin/test/functional/applications_controller_test.rb +49 -0
  89. data/admin/test/functional/message_routes_controller_test.rb +49 -0
  90. data/admin/test/functional/message_types_controller_test.rb +49 -0
  91. data/admin/test/functional/messages_controller_test.rb +49 -0
  92. data/admin/test/performance/browsing_test.rb +12 -0
  93. data/admin/test/test_helper.rb +13 -0
  94. data/admin/test/unit/application_test.rb +7 -0
  95. data/admin/test/unit/helpers/applications_helper_test.rb +4 -0
  96. data/admin/test/unit/helpers/message_routes_helper_test.rb +4 -0
  97. data/admin/test/unit/helpers/message_types_helper_test.rb +4 -0
  98. data/admin/test/unit/helpers/messages_helper_test.rb +4 -0
  99. data/admin/test/unit/message_route_test.rb +7 -0
  100. data/admin/test/unit/message_test.rb +7 -0
  101. data/admin/test/unit/message_type_test.rb +7 -0
  102. data/bin/eventbus_dispatcher.rb +118 -0
  103. data/bin/eventbus_emailer.rb +41 -0
  104. data/lib/eventbus/connectors/amqp.rb +70 -0
  105. data/lib/eventbus/connectors/bunny.rb +71 -0
  106. data/lib/eventbus/connectors/stomp.rb +77 -0
  107. data/lib/eventbus/message.rb +180 -0
  108. data/lib/eventbus/queue.rb +28 -0
  109. data/lib/eventbus/service.rb +116 -0
  110. metadata +188 -0
@@ -0,0 +1,49 @@
1
+ require 'test_helper'
2
+
3
+ class ApplicationsControllerTest < ActionController::TestCase
4
+ setup do
5
+ @application = applications(:one)
6
+ end
7
+
8
+ test "should get index" do
9
+ get :index
10
+ assert_response :success
11
+ assert_not_nil assigns(:applications)
12
+ end
13
+
14
+ test "should get new" do
15
+ get :new
16
+ assert_response :success
17
+ end
18
+
19
+ test "should create application" do
20
+ assert_difference('Application.count') do
21
+ post :create, application: @application.attributes
22
+ end
23
+
24
+ assert_redirected_to application_path(assigns(:application))
25
+ end
26
+
27
+ test "should show application" do
28
+ get :show, id: @application
29
+ assert_response :success
30
+ end
31
+
32
+ test "should get edit" do
33
+ get :edit, id: @application
34
+ assert_response :success
35
+ end
36
+
37
+ test "should update application" do
38
+ put :update, id: @application, application: @application.attributes
39
+ assert_redirected_to application_path(assigns(:application))
40
+ end
41
+
42
+ test "should destroy application" do
43
+ assert_difference('Application.count', -1) do
44
+ delete :destroy, id: @application
45
+ end
46
+
47
+ assert_redirected_to applications_path
48
+ end
49
+ end
@@ -0,0 +1,49 @@
1
+ require 'test_helper'
2
+
3
+ class MessageRoutesControllerTest < ActionController::TestCase
4
+ setup do
5
+ @message_route = message_routes(:one)
6
+ end
7
+
8
+ test "should get index" do
9
+ get :index
10
+ assert_response :success
11
+ assert_not_nil assigns(:message_routes)
12
+ end
13
+
14
+ test "should get new" do
15
+ get :new
16
+ assert_response :success
17
+ end
18
+
19
+ test "should create message_route" do
20
+ assert_difference('MessageRoute.count') do
21
+ post :create, message_route: @message_route.attributes
22
+ end
23
+
24
+ assert_redirected_to message_route_path(assigns(:message_route))
25
+ end
26
+
27
+ test "should show message_route" do
28
+ get :show, id: @message_route
29
+ assert_response :success
30
+ end
31
+
32
+ test "should get edit" do
33
+ get :edit, id: @message_route
34
+ assert_response :success
35
+ end
36
+
37
+ test "should update message_route" do
38
+ put :update, id: @message_route, message_route: @message_route.attributes
39
+ assert_redirected_to message_route_path(assigns(:message_route))
40
+ end
41
+
42
+ test "should destroy message_route" do
43
+ assert_difference('MessageRoute.count', -1) do
44
+ delete :destroy, id: @message_route
45
+ end
46
+
47
+ assert_redirected_to message_routes_path
48
+ end
49
+ end
@@ -0,0 +1,49 @@
1
+ require 'test_helper'
2
+
3
+ class MessageTypesControllerTest < ActionController::TestCase
4
+ setup do
5
+ @message_type = message_types(:one)
6
+ end
7
+
8
+ test "should get index" do
9
+ get :index
10
+ assert_response :success
11
+ assert_not_nil assigns(:message_types)
12
+ end
13
+
14
+ test "should get new" do
15
+ get :new
16
+ assert_response :success
17
+ end
18
+
19
+ test "should create message_type" do
20
+ assert_difference('MessageType.count') do
21
+ post :create, message_type: @message_type.attributes
22
+ end
23
+
24
+ assert_redirected_to message_type_path(assigns(:message_type))
25
+ end
26
+
27
+ test "should show message_type" do
28
+ get :show, id: @message_type
29
+ assert_response :success
30
+ end
31
+
32
+ test "should get edit" do
33
+ get :edit, id: @message_type
34
+ assert_response :success
35
+ end
36
+
37
+ test "should update message_type" do
38
+ put :update, id: @message_type, message_type: @message_type.attributes
39
+ assert_redirected_to message_type_path(assigns(:message_type))
40
+ end
41
+
42
+ test "should destroy message_type" do
43
+ assert_difference('MessageType.count', -1) do
44
+ delete :destroy, id: @message_type
45
+ end
46
+
47
+ assert_redirected_to message_types_path
48
+ end
49
+ end
@@ -0,0 +1,49 @@
1
+ require 'test_helper'
2
+
3
+ class MessagesControllerTest < ActionController::TestCase
4
+ setup do
5
+ @message = messages(:one)
6
+ end
7
+
8
+ test "should get index" do
9
+ get :index
10
+ assert_response :success
11
+ assert_not_nil assigns(:messages)
12
+ end
13
+
14
+ test "should get new" do
15
+ get :new
16
+ assert_response :success
17
+ end
18
+
19
+ test "should create message" do
20
+ assert_difference('Message.count') do
21
+ post :create, message: @message.attributes
22
+ end
23
+
24
+ assert_redirected_to message_path(assigns(:message))
25
+ end
26
+
27
+ test "should show message" do
28
+ get :show, id: @message
29
+ assert_response :success
30
+ end
31
+
32
+ test "should get edit" do
33
+ get :edit, id: @message
34
+ assert_response :success
35
+ end
36
+
37
+ test "should update message" do
38
+ put :update, id: @message, message: @message.attributes
39
+ assert_redirected_to message_path(assigns(:message))
40
+ end
41
+
42
+ test "should destroy message" do
43
+ assert_difference('Message.count', -1) do
44
+ delete :destroy, id: @message
45
+ end
46
+
47
+ assert_redirected_to messages_path
48
+ end
49
+ end
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+ require 'rails/performance_test_help'
3
+
4
+ class BrowsingTest < ActionDispatch::PerformanceTest
5
+ # Refer to the documentation for all available options
6
+ # self.profile_options = { :runs => 5, :metrics => [:wall_time, :memory]
7
+ # :output => 'tmp/performance', :formats => [:flat] }
8
+
9
+ def test_homepage
10
+ get '/'
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path('../../config/environment', __FILE__)
3
+ require 'rails/test_help'
4
+
5
+ class ActiveSupport::TestCase
6
+ # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
7
+ #
8
+ # Note: You'll currently still have to declare fixtures explicitly in integration tests
9
+ # -- they do not yet inherit this setting
10
+ fixtures :all
11
+
12
+ # Add more helper methods to be used by all tests here...
13
+ end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class ApplicationTest < ActiveSupport::TestCase
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ class ApplicationsHelperTest < ActionView::TestCase
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ class MessageRoutesHelperTest < ActionView::TestCase
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ class MessageTypesHelperTest < ActionView::TestCase
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ class MessagesHelperTest < ActionView::TestCase
4
+ end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class MessageRouteTest < ActiveSupport::TestCase
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class MessageTest < ActiveSupport::TestCase
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class MessageTypeTest < ActiveSupport::TestCase
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ admin_base = ENV['EVENTBUS_PORTAL_BASE'] || './admin'
4
+ puts "Loading environment.rb from: #{admin_base}/config/"
5
+
6
+ require 'eventbus/service'
7
+ require 'eventbus/message'
8
+ require "#{admin_base}/config/environment"
9
+
10
+ class DispatcherService < EventBus::Service
11
+
12
+ class ConfigurationError < RuntimeError
13
+ end
14
+
15
+ def initialize
16
+ super("EVENT_BUS_CORE")
17
+ self.listen_queue = "dispatcher"
18
+ self.system_process = true
19
+ end
20
+
21
+
22
+ def process_message(incoming_msg)
23
+
24
+ msg = EventBus::Message.new("EVENT_BUS_CORE")
25
+ msg.load(incoming_msg)
26
+
27
+ puts "Application Key: #{msg.application_id}"
28
+ puts "Message ID: #{msg.message_id}"
29
+ puts "Message type: #{msg.message_type}"
30
+ puts "Message status: #{msg.status}"
31
+
32
+ puts "Finding application for key #{msg.application_id}"
33
+ app = Application.find_by_key(msg.application_id)
34
+
35
+ if app.nil?
36
+ puts "Unable to find an application with key #{msg.application_id}"
37
+
38
+ msg.status = "DispatcherConfigurationError"
39
+ msg.is_error = true
40
+ msg.error_message = "Dispatcher has no application defined with key #{msg.application_id}"
41
+ log_message nil, msg
42
+ return
43
+ end
44
+
45
+ puts "Found application: #{app.inspect}"
46
+
47
+ msg_type = app.message_types.find_by_name(msg.message_type)
48
+
49
+ if msg_type.nil?
50
+ log_message app, msg
51
+ puts "No configuration found for Application Key #{app.key}, MessageType #{msg.message_type}"
52
+
53
+ msg.status = "DispatcherConfigurationError"
54
+ msg.is_error = true
55
+ msg.error_message = "Application #{app.name} (#{app.key}) has no message type defined as: (#{msg.message_type})"
56
+ log_message app, msg
57
+ return
58
+ else
59
+ count = 0
60
+ msg_type.message_routes.where(:incoming_status => msg.status).each do | route |
61
+ puts "Found route: #{route.dispatch_to}"
62
+ msg.send(:queue_name => route.dispatch_to)
63
+ count = count + 1
64
+
65
+ log_message app, msg, msg_type, route
66
+ end
67
+
68
+ if msg.is_error
69
+ msg_type.message_routes.where(:match_errors => true).each do | route |
70
+ puts "Matched error route: #{route.dispatch_to}"
71
+ msg.send(:queue_name => route.dispatch_to)
72
+ count = count + 1
73
+
74
+ log_message app, msg, msg_type, route
75
+ end
76
+ end
77
+
78
+ if count == 0
79
+ puts "No routes found for MessageType #{msg_type.name} Status #{msg.status}. Will log only."
80
+ log_message app, msg, msg_type
81
+ end
82
+ end
83
+
84
+ end
85
+
86
+
87
+ def log_message(application = nil, msg = nil, msg_type = nil, route = nil)
88
+
89
+ log = Message.new
90
+
91
+ unless application.nil?
92
+ log.application_id = application.id
93
+ end
94
+
95
+ unless msg.nil?
96
+ log.application_key = msg.application_id
97
+ log.message_type_name = msg.message_type
98
+ log.status = msg.status
99
+ log.content = msg.dump
100
+ log.is_error = msg.is_error
101
+ log.message_guid = msg.message_id
102
+ end
103
+
104
+ unless msg_type.nil?
105
+ log.message_type_id = msg_type.id
106
+ end
107
+
108
+ unless route.nil?
109
+ log.dispatch_to = route.dispatch_to
110
+ end
111
+
112
+ log.save
113
+
114
+ end
115
+
116
+ end
117
+
118
+ DispatcherService.new.start(:max_workers => 5)
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env railsrunner
2
+
3
+ gem 'eventbus'
4
+ require 'eventbus/service'
5
+ require 'eventbus/message'
6
+
7
+ class EmailRequest < EventBus::Message
8
+ def initialize
9
+ super("EVENT_BUS_CORE")
10
+ end
11
+
12
+ def contents
13
+ get("web_message")
14
+ end
15
+ end
16
+
17
+
18
+ class EmailService < EventBus::Service
19
+
20
+ def initialize
21
+ super("EVENT_BUS_CORE")
22
+ self.listen_queue = "email"
23
+ end
24
+
25
+
26
+ def process_message(incoming_msg)
27
+
28
+ msg = EmailRequest.new
29
+ msg.load(incoming_msg[:payload])
30
+
31
+ puts "Sending email with contents:"
32
+ puts msg.contents
33
+
34
+ msg.status = "EMAIL_SENT"
35
+ msg.send
36
+
37
+ end
38
+
39
+ end
40
+
41
+ EmailService.new.start
@@ -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