eventq 2.0.0.rc1

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 (65) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +336 -0
  3. data/bin/console +14 -0
  4. data/bin/setup +8 -0
  5. data/lib/eventq/aws.rb +38 -0
  6. data/lib/eventq/eventq_aws/README.md +53 -0
  7. data/lib/eventq/eventq_aws/aws_eventq_client.rb +120 -0
  8. data/lib/eventq/eventq_aws/aws_queue_client.rb +64 -0
  9. data/lib/eventq/eventq_aws/aws_queue_manager.rb +68 -0
  10. data/lib/eventq/eventq_aws/aws_queue_worker.rb +168 -0
  11. data/lib/eventq/eventq_aws/aws_status_checker.rb +25 -0
  12. data/lib/eventq/eventq_aws/aws_subscription_manager.rb +65 -0
  13. data/lib/eventq/eventq_aws/jruby/aws_queue_worker.rb +370 -0
  14. data/lib/eventq/eventq_aws/sns.rb +64 -0
  15. data/lib/eventq/eventq_aws/sqs.rb +112 -0
  16. data/lib/eventq/eventq_base/configuration.rb +33 -0
  17. data/lib/eventq/eventq_base/event_raised_exchange.rb +7 -0
  18. data/lib/eventq/eventq_base/event_raised_queue.rb +7 -0
  19. data/lib/eventq/eventq_base/eventq_client_contract.rb +9 -0
  20. data/lib/eventq/eventq_base/eventq_logger.rb +28 -0
  21. data/lib/eventq/eventq_base/exceptions/invalid_signature_exception.rb +9 -0
  22. data/lib/eventq/eventq_base/exceptions/worker_thread_error.rb +10 -0
  23. data/lib/eventq/eventq_base/exceptions.rb +2 -0
  24. data/lib/eventq/eventq_base/exchange.rb +5 -0
  25. data/lib/eventq/eventq_base/message_args.rb +23 -0
  26. data/lib/eventq/eventq_base/nonce_manager.rb +57 -0
  27. data/lib/eventq/eventq_base/queue.rb +27 -0
  28. data/lib/eventq/eventq_base/queue_message.rb +31 -0
  29. data/lib/eventq/eventq_base/queue_worker_contract.rb +23 -0
  30. data/lib/eventq/eventq_base/serialization_providers/binary_serialization_provider.rb +15 -0
  31. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/array_writer.rb +20 -0
  32. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/attribute_writer.rb +24 -0
  33. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/class_writer.rb +20 -0
  34. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/date_time_writer.rb +33 -0
  35. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/date_writer.rb +22 -0
  36. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/hash_writer.rb +18 -0
  37. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/rational_writer.rb +20 -0
  38. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/serializer.rb +17 -0
  39. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/time_writer.rb +18 -0
  40. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/value_writer.rb +16 -0
  41. data/lib/eventq/eventq_base/serialization_providers/jruby/oj.rb +10 -0
  42. data/lib/eventq/eventq_base/serialization_providers/jruby/oj_serialization_provider.rb +25 -0
  43. data/lib/eventq/eventq_base/serialization_providers/jruby.rb +2 -0
  44. data/lib/eventq/eventq_base/serialization_providers/json_serialization_provider.rb +28 -0
  45. data/lib/eventq/eventq_base/serialization_providers/oj_serialization_provider.rb +24 -0
  46. data/lib/eventq/eventq_base/serialization_providers.rb +36 -0
  47. data/lib/eventq/eventq_base/signature_providers/sha256_signature_provider.rb +31 -0
  48. data/lib/eventq/eventq_base/signature_providers.rb +44 -0
  49. data/lib/eventq/eventq_base/subscription_manager_contract.rb +13 -0
  50. data/lib/eventq/eventq_base/version.rb +3 -0
  51. data/lib/eventq/eventq_base/worker_id.rb +20 -0
  52. data/lib/eventq/eventq_rabbitmq/README.md +36 -0
  53. data/lib/eventq/eventq_rabbitmq/default_queue.rb +12 -0
  54. data/lib/eventq/eventq_rabbitmq/jruby/rabbitmq_queue_worker.rb +367 -0
  55. data/lib/eventq/eventq_rabbitmq/rabbitmq_eventq_client.rb +140 -0
  56. data/lib/eventq/eventq_rabbitmq/rabbitmq_queue_client.rb +54 -0
  57. data/lib/eventq/eventq_rabbitmq/rabbitmq_queue_manager.rb +104 -0
  58. data/lib/eventq/eventq_rabbitmq/rabbitmq_queue_worker.rb +168 -0
  59. data/lib/eventq/eventq_rabbitmq/rabbitmq_status_checker.rb +62 -0
  60. data/lib/eventq/eventq_rabbitmq/rabbitmq_subscription_manager.rb +54 -0
  61. data/lib/eventq/queue_worker.rb +241 -0
  62. data/lib/eventq/rabbitmq.rb +49 -0
  63. data/lib/eventq/worker_status.rb +64 -0
  64. data/lib/eventq.rb +25 -0
  65. metadata +289 -0
@@ -0,0 +1,140 @@
1
+ require 'thread'
2
+ module EventQ
3
+ module RabbitMq
4
+ # Implements a general interface to raise an event
5
+ # EventQ::Amazon::EventQClient is the sister-class which does the same for AWS
6
+ class EventQClient
7
+
8
+ def initialize(options={})
9
+
10
+ if options[:client] == nil
11
+ raise ':client (QueueClient) must be specified.'.freeze
12
+ end
13
+
14
+ @client = options[:client]
15
+ @queue_manager = QueueManager.new
16
+ @event_raised_exchange = EventRaisedExchange.new
17
+ @serialization_manager = EventQ::SerializationProviders::Manager.new
18
+ @signature_manager = EventQ::SignatureProviders::Manager.new
19
+
20
+ # this array is used to record known event types
21
+ @known_event_types = []
22
+
23
+ @connection_pool = ::Queue.new
24
+ end
25
+
26
+ def check_out_connection
27
+ @connection_pool.pop(true)
28
+ rescue
29
+ @client.get_connection
30
+ end
31
+
32
+ def check_in_connection(connection)
33
+ @connection_pool.push(connection)
34
+ end
35
+
36
+ def registered?(event_type)
37
+ @known_event_types.include?(event_type)
38
+ end
39
+
40
+ def register_event(event_type)
41
+ if registered?(event_type)
42
+ return true
43
+ end
44
+
45
+ @known_event_types << event_type
46
+ true
47
+ end
48
+
49
+ def publish(topic:, event:, context: {})
50
+ raise_event(topic, event, context)
51
+ end
52
+
53
+ def raise_event(event_type, event, context = {})
54
+ register_event(event_type)
55
+
56
+ _event_type = EventQ.create_event_type(event_type)
57
+
58
+ with_connection do |channel|
59
+ exchange = @queue_manager.get_exchange(channel, @event_raised_exchange)
60
+
61
+ message = serialized_message(event_type, event, context)
62
+
63
+ exchange.publish(message, routing_key: _event_type)
64
+
65
+ EventQ.logger.debug do
66
+ "[#{self.class}] - Raised event to Exchange. Routing Key: #{_event_type} | Message: #{message}."
67
+ end
68
+ end
69
+ end
70
+
71
+ def raise_event_in_queue(event_type, event, queue, delay, context = {})
72
+ register_event(event_type)
73
+
74
+ _event_type = EventQ.create_event_type(event_type)
75
+
76
+ with_connection do |channel|
77
+ exchange = @queue_manager.get_queue_exchange(channel, queue)
78
+
79
+ delay_exchange = @queue_manager.get_delay_exchange(channel, queue, delay)
80
+
81
+ delay_queue = @queue_manager.create_delay_queue(channel, queue, exchange.name, delay)
82
+ delay_queue.bind(delay_exchange, routing_key: _event_type)
83
+
84
+ _queue_name = EventQ.create_queue_name(queue.name)
85
+
86
+ q = channel.queue(_queue_name, durable: @queue_manager.durable)
87
+ q.bind(exchange, routing_key: _event_type)
88
+
89
+ message = serialized_message(event_type, event, context)
90
+
91
+ delay_exchange.publish(message, routing_key: _event_type)
92
+
93
+ EventQ.logger.debug do
94
+ "[#{self.class}] - Raised event to Queue: #{_queue_name} | Message: #{message} | Delay: #{delay}."
95
+ end
96
+ end
97
+ end
98
+
99
+ def new_message
100
+ EventQ::QueueMessage.new
101
+ end
102
+
103
+ private
104
+
105
+ def with_connection
106
+ connection = check_out_connection
107
+
108
+ begin
109
+ channel = connection.create_channel
110
+
111
+ yield(channel)
112
+
113
+ ensure
114
+ channel&.close if channel.open?
115
+ check_in_connection(connection)
116
+ end
117
+
118
+ true
119
+ end
120
+
121
+ def serialized_message(event_type, event, context)
122
+ qm = new_message
123
+ qm.content = event
124
+ qm.type = event_type
125
+ qm.context = context
126
+ qm.content_type = event.class.to_s
127
+
128
+ if EventQ::Configuration.signature_secret != nil
129
+ provider = @signature_manager.get_provider(EventQ::Configuration.signature_provider)
130
+ qm.signature = provider.write(message: qm, secret: EventQ::Configuration.signature_secret)
131
+ end
132
+
133
+ serialization_provider = @serialization_manager.get_provider(EventQ::Configuration.serialization_provider)
134
+
135
+ serialization_provider.serialize(qm)
136
+ end
137
+ end
138
+ end
139
+ end
140
+
@@ -0,0 +1,54 @@
1
+ module EventQ
2
+ module RabbitMq
3
+ class QueueClient
4
+
5
+ GUEST = 'guest'.freeze
6
+
7
+ def initialize(options = {})
8
+
9
+ if options[:endpoint] == nil
10
+ raise ':endpoint must be specified.'.freeze
11
+ end
12
+
13
+ @endpoint = options[:endpoint]
14
+
15
+ @port = Integer(options[:port] || 5672)
16
+
17
+ @user = options[:user] || GUEST
18
+
19
+ @password = options[:password] || GUEST
20
+
21
+ @ssl = options[:ssl] == true || false
22
+
23
+ end
24
+
25
+ def connection_options
26
+ {
27
+ :host => @endpoint,
28
+ :port => @port,
29
+ :user => @user,
30
+ :pass => @password,
31
+ :ssl => @ssl,
32
+ :read_timeout => 4,
33
+ :heartbeat => 8,
34
+ :continuation_timeout => 5000,
35
+ :automatically_recover => true,
36
+ :network_recovery_interval => 1,
37
+ :recover_from_connection_close => true
38
+ }
39
+ end
40
+
41
+ def get_connection
42
+ if RUBY_PLATFORM =~ /java/
43
+ conn = MarchHare.connect(connection_options)
44
+ else
45
+ conn = Bunny.new(connection_options)
46
+ end
47
+
48
+ conn.start
49
+ return conn
50
+ end
51
+
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,104 @@
1
+ module EventQ
2
+ module RabbitMq
3
+ class QueueManager
4
+
5
+ X_DEAD_LETTER_EXCHANGE = 'x-dead-letter-exchange'.freeze
6
+ X_MESSAGE_TTL = 'x-message-ttl'.freeze
7
+
8
+ attr_accessor :durable
9
+
10
+ def initialize
11
+ @event_raised_exchange = EventQ::EventRaisedExchange.new
12
+ @durable = true
13
+ end
14
+
15
+ def get_queue(channel, queue)
16
+
17
+ _queue_name = EventQ.create_queue_name(queue.name)
18
+
19
+ # get/create the queue
20
+ q = channel.queue(_queue_name, :durable => @durable)
21
+
22
+ subscriber_exchange = get_subscriber_exchange(channel, queue)
23
+
24
+ if queue.allow_retry
25
+ retry_exchange = get_retry_exchange(channel, queue)
26
+ retry_queue = get_retry_queue(channel, queue)
27
+ retry_queue.bind(retry_exchange)
28
+ end
29
+
30
+ q.bind(subscriber_exchange)
31
+
32
+ return q
33
+ end
34
+
35
+ def pop_message(queue:)
36
+ if RUBY_PLATFORM =~ /java/
37
+ headers, payload = queue.pop({ :ack => true, :block => true })
38
+ if headers == nil
39
+ return [nil,nil]
40
+ end
41
+ [headers.delivery_tag, payload]
42
+ else
43
+ headers, properties, payload = queue.pop({ :manual_ack => true, :block => true })
44
+ if headers == nil
45
+ return [nil,nil]
46
+ end
47
+ [headers.delivery_tag, payload]
48
+ end
49
+ end
50
+
51
+ def get_queue_exchange(channel, queue)
52
+ _exchange_name = EventQ.create_exchange_name(queue.name)
53
+ channel.fanout("#{_exchange_name}.ex")
54
+ end
55
+
56
+ def get_retry_exchange(channel, queue)
57
+ _queue_name = EventQ.create_queue_name(queue.name)
58
+ return channel.fanout("#{_queue_name}.r.ex")
59
+ end
60
+
61
+ def get_subscriber_exchange(channel, queue)
62
+ _queue_name = EventQ.create_queue_name(queue.name)
63
+ return channel.fanout("#{_queue_name}.ex")
64
+ end
65
+
66
+ def get_delay_exchange(channel, queue, delay)
67
+ _queue_name = EventQ.create_queue_name(queue.name)
68
+ channel.direct("#{_queue_name}.#{delay}.d.ex")
69
+ end
70
+
71
+ def get_retry_queue(channel, queue)
72
+ subscriber_exchange = get_subscriber_exchange(channel, queue)
73
+
74
+ _queue_name = EventQ.create_queue_name(queue.name)
75
+
76
+ if queue.allow_retry_back_off == true
77
+
78
+ EventQ.logger.debug { "[#{self.class}] - Requesting retry queue. x-dead-letter-exchange: #{subscriber_exchange.name} | x-message-ttl: #{queue.max_retry_delay}" }
79
+
80
+ return channel.queue("#{_queue_name}.r", :durable => @durable, :arguments => { X_DEAD_LETTER_EXCHANGE => subscriber_exchange.name, X_MESSAGE_TTL => queue.max_retry_delay })
81
+
82
+ else
83
+
84
+ EventQ.logger.debug { "[#{self.class}] - Requesting retry queue. x-dead-letter-exchange: #{subscriber_exchange.name} | x-message-ttl: #{queue.retry_delay}" }
85
+
86
+ return channel.queue("#{_queue_name}.r", :durable => @durable, :arguments => { X_DEAD_LETTER_EXCHANGE => subscriber_exchange.name, X_MESSAGE_TTL => queue.retry_delay })
87
+
88
+ end
89
+
90
+ end
91
+
92
+ def create_delay_queue(channel, queue, dlx_name, delay=0)
93
+ queue_name = EventQ.create_queue_name(queue.name)
94
+ channel.queue("#{queue_name}.#{delay}.delay", durable: @durable,
95
+ arguments: { X_DEAD_LETTER_EXCHANGE => dlx_name, X_MESSAGE_TTL => delay * 1000 })
96
+ end
97
+
98
+ def get_exchange(channel, exchange)
99
+ _exchange_name = EventQ.create_exchange_name(exchange.name)
100
+ return channel.direct(_exchange_name, :durable => @durable)
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,168 @@
1
+ module EventQ
2
+ module RabbitMq
3
+ class QueueWorker
4
+ include EventQ::WorkerId
5
+
6
+ attr_accessor :is_running, :context
7
+
8
+ def initialize
9
+ @serialization_provider_manager = EventQ::SerializationProviders::Manager.new
10
+ @signature_provider_manager = EventQ::SignatureProviders::Manager.new
11
+ end
12
+
13
+ def pre_process(context, options)
14
+ manager = EventQ::RabbitMq::QueueManager.new
15
+ manager.durable = options[:durable]
16
+ options[:manager] = manager
17
+
18
+ connection = options[:client].dup.get_connection
19
+ options[:connection] = connection
20
+ end
21
+
22
+ # This method should not be called iteratively and will sit in a loop
23
+ # The reason is because this uses a push notification from the subscribe mechanism to trigger the
24
+ # block and will exit if you do not block.
25
+ def thread_process_iteration(queue, options, block)
26
+ manager = options[:manager]
27
+ channel = options[:connection].create_channel
28
+ channel.prefetch(1)
29
+
30
+ q = manager.get_queue(channel, queue)
31
+ retry_exchange = manager.get_retry_exchange(channel, queue)
32
+
33
+ q.subscribe(:manual_ack => true, :block => false, :exclusive => false) do |delivery_info, properties, payload|
34
+ begin
35
+ tag_processing_thread
36
+ process_message(payload, queue, channel, retry_exchange, delivery_info.delivery_tag, block)
37
+ rescue => e
38
+ EventQ.logger.error(
39
+ "[#{self.class}] - An error occurred attempting to process a message. Error: #{e} | "\
40
+ "Backtrace: #{e.backtrace}"
41
+ )
42
+ context.call_on_error_block(error: e)
43
+ ensure
44
+ untag_processing_thread
45
+ end
46
+ end
47
+
48
+ # we don't want to stop the subscribe process as it will not block.
49
+ sleep 5 while context.running?
50
+
51
+ if channel != nil && channel.open?
52
+ channel.close
53
+ end
54
+ end
55
+
56
+ def deserialize_message(payload)
57
+ provider = @serialization_provider_manager.get_provider(EventQ::Configuration.serialization_provider)
58
+ return provider.deserialize(payload)
59
+ end
60
+
61
+ def serialize_message(msg)
62
+ provider = @serialization_provider_manager.get_provider(EventQ::Configuration.serialization_provider)
63
+ return provider.serialize(msg)
64
+ end
65
+
66
+ def reject_message(channel, message, delivery_tag, retry_exchange, queue, abort)
67
+
68
+ EventQ.logger.info("[#{self.class}] - Message rejected removing from queue.")
69
+ #reject the message to remove from queue
70
+ channel.reject(delivery_tag, false)
71
+
72
+ #check if the message retry limit has been exceeded
73
+ if message.retry_attempts >= queue.max_retry_attempts
74
+
75
+ EventQ.logger.info("[#{self.class}] - Message retry attempt limit exceeded. Msg: #{serialize_message(message)}")
76
+
77
+ context.call_on_retry_exceeded_block(message)
78
+
79
+ #check if the message is allowed to be retried
80
+ elsif queue.allow_retry
81
+
82
+ EventQ.logger.debug { "[#{self.class}] - Incrementing retry attempts count." }
83
+ message.retry_attempts += 1
84
+
85
+ if queue.allow_retry_back_off == true
86
+ EventQ.logger.debug { "[#{self.class}] - Calculating message back off retry delay. Attempts: #{message.retry_attempts} * Retry Delay: #{queue.retry_delay}" }
87
+ message_ttl = message.retry_attempts * queue.retry_delay
88
+ if (message.retry_attempts * queue.retry_delay) > queue.max_retry_delay
89
+ EventQ.logger.debug { "[#{self.class}] - Max message back off retry delay reached." }
90
+ message_ttl = queue.max_retry_delay
91
+ end
92
+ else
93
+ EventQ.logger.debug { "[#{self.class}] - Setting fixed retry delay for message." }
94
+ message_ttl = queue.retry_delay
95
+ end
96
+
97
+ EventQ.logger.debug { "[#{self.class}] - Sending message for retry. Message TTL: #{message_ttl}" }
98
+ retry_exchange.publish(serialize_message(message), :expiration => message_ttl)
99
+ EventQ.logger.debug { "[#{self.class}] - Published message to retry exchange." }
100
+
101
+ context.call_on_retry_block(message)
102
+
103
+ end
104
+
105
+ return true
106
+
107
+ end
108
+
109
+ def configure(options = {})
110
+ options[:durable] ||= true
111
+ end
112
+
113
+ private
114
+
115
+ def process_message(payload, queue, channel, retry_exchange, delivery_tag, block)
116
+ abort = false
117
+ error = false
118
+ message = deserialize_message(payload)
119
+
120
+ EventQ.logger.info("[#{self.class}] - Message received. Retry Attempts: #{message.retry_attempts}")
121
+
122
+ @signature_provider_manager.validate_signature(message: message, queue: queue)
123
+
124
+ message_args = EventQ::MessageArgs.new(
125
+ type: message.type,
126
+ retry_attempts: message.retry_attempts,
127
+ context: message.context,
128
+ content_type: message.content_type,
129
+ id: message.id,
130
+ sent: message.created
131
+ )
132
+
133
+ if(!EventQ::NonceManager.is_allowed?(message.id))
134
+ EventQ.logger.info("[#{self.class}] - Duplicate Message received. Dropping message.")
135
+ channel.acknowledge(delivery_tag, false)
136
+ return false
137
+ end
138
+
139
+ # begin worker block for queue message
140
+ begin
141
+ block.call(message.content, message_args)
142
+
143
+ if message_args.abort == true
144
+ abort = true
145
+ EventQ.logger.info("[#{self.class}] - Message aborted.")
146
+ else
147
+ # accept the message as processed
148
+ channel.acknowledge(delivery_tag, false)
149
+ EventQ.logger.info("[#{self.class}] - Message acknowledged.")
150
+ end
151
+
152
+ rescue => e
153
+ EventQ.logger.error("[#{self.class}] - An unhandled error happened attempting to process a queue message. Error: #{e} | Backtrace: #{e.backtrace}")
154
+ error = true
155
+ context.call_on_error_block(error: e, message: message)
156
+ end
157
+
158
+ if error || abort
159
+ EventQ::NonceManager.failed(message.id)
160
+ reject_message(channel, message, delivery_tag, retry_exchange, queue, abort)
161
+ else
162
+ EventQ::NonceManager.complete(message.id)
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
168
+
@@ -0,0 +1,62 @@
1
+ module EventQ
2
+ module RabbitMq
3
+ class StatusChecker
4
+
5
+ def initialize(client:, queue_manager:)
6
+
7
+ if client == nil
8
+ raise 'client must be specified.'.freeze
9
+ end
10
+
11
+ @client = client
12
+
13
+ if queue_manager == nil
14
+ raise 'queue_manager must be specified.'.freeze
15
+ end
16
+
17
+ @queue_manager = queue_manager
18
+
19
+ @event_raised_exchange = EventRaisedExchange.new
20
+
21
+ end
22
+
23
+ def queue?(queue)
24
+
25
+ outcome = true
26
+
27
+ begin
28
+ connection = @client.get_connection
29
+ channel = connection.create_channel
30
+ _queue_name = EventQ.create_queue_name(queue.name)
31
+ channel.queue(_queue_name, :durable => true)
32
+ rescue
33
+ outcome = false
34
+ ensure
35
+ channel.close if channel
36
+ connection.close if connection
37
+ end
38
+
39
+ outcome
40
+ end
41
+
42
+ def event_type?(event_type)
43
+
44
+ outcome = true
45
+
46
+ begin
47
+ connection = @client.get_connection
48
+ channel = connection.create_channel
49
+ @queue_manager.get_exchange(channel, @event_raised_exchange)
50
+ rescue
51
+ outcome = false
52
+ ensure
53
+ channel.close if channel
54
+ connection.close if connection
55
+ end
56
+
57
+ outcome
58
+ end
59
+
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,54 @@
1
+ module EventQ
2
+ module RabbitMq
3
+ class SubscriptionManager
4
+
5
+ def initialize(options = {})
6
+ if options[:client] == nil
7
+ raise ':client (QueueClient) must be specified.'.freeze
8
+ end
9
+ @client = options[:client]
10
+ @queue_manager = QueueManager.new
11
+ @event_raised_exchange = EventQ::EventRaisedExchange.new
12
+ end
13
+
14
+ def subscribe(event_type, queue)
15
+
16
+ _event_type = EventQ.create_event_type(event_type)
17
+
18
+ connection = @client.get_connection
19
+ channel = connection.create_channel
20
+
21
+ queue = @queue_manager.get_queue(channel, queue)
22
+ exchange = @queue_manager.get_exchange(channel, @event_raised_exchange)
23
+
24
+ queue.bind(exchange, :routing_key => _event_type)
25
+
26
+ channel.close
27
+ connection.close
28
+
29
+ EventQ.logger.debug do
30
+ "[#{self.class} #subscribe] - Subscribing queue: #{queue.name} to Exchange: #{_event_type}"
31
+ end
32
+
33
+ return true
34
+ end
35
+
36
+ def unsubscribe(queue)
37
+
38
+ connection = @client.get_connection
39
+ channel = connection.create_channel
40
+
41
+ queue = @queue_manager.get_queue(channel, queue)
42
+ exchange = @queue_manager.get_exchange(channel, @event_raised_exchange)
43
+
44
+ queue.unbind(exchange)
45
+
46
+ channel.close
47
+ connection.close
48
+
49
+ return true
50
+ end
51
+
52
+ end
53
+ end
54
+ end