eventhub-processor2 1.8.0 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
data/example/receiver.rb CHANGED
@@ -1,9 +1,9 @@
1
- require_relative '../lib/eventhub/base'
1
+ require_relative "../lib/eventhub/base"
2
2
 
3
3
  module EventHub
4
4
  class Receiver < Processor2
5
5
  def handle_message(message, args = {})
6
- id = message.body['id']
6
+ id = message.body["id"]
7
7
  EventHub.logger.info("[#{id}] - Received")
8
8
 
9
9
  file_name = "data/#{id}.json"
data/example/router.rb CHANGED
@@ -1,12 +1,12 @@
1
- require_relative '../lib/eventhub/base'
1
+ require_relative "../lib/eventhub/base"
2
2
 
3
3
  module EventHub
4
4
  # Demo class
5
5
  class Router < Processor2
6
6
  def handle_message(message, args = {})
7
- id = message.body['id']
7
+ id = message.body["id"]
8
8
  EventHub.logger.info("Received: [#{id}]")
9
- publish(message: message.to_json, exchange_name: 'example.inbound')
9
+ publish(message: message.to_json, exchange_name: "example.inbound")
10
10
  EventHub.logger.info("Returned: [#{id}]")
11
11
  nil
12
12
  end
@@ -12,23 +12,23 @@ module EventHub
12
12
  end
13
13
 
14
14
  def start
15
- EventHub.logger.info('Heartbeat is starting...')
15
+ EventHub.logger.info("Heartbeat is starting...")
16
16
 
17
- every(300) { EventHub.logger.info("Actual actors: #{Celluloid::Actor.all.size}: #{Celluloid::Actor.all.map{ |a| a.class }.join(', ') }") }
17
+ every(60 * 60 * 24) { EventHub.logger.info("Actual actors: #{Celluloid::Actor.all.size}: #{Celluloid::Actor.all.map { |a| a.class }.join(", ")}") }
18
18
 
19
- publish(heartbeat(action: 'started'))
20
- EventHub.logger.info('Heartbeat has sent [started] beat')
19
+ publish(heartbeat(action: "started"))
20
+ EventHub.logger.info("Heartbeat has sent [started] beat")
21
21
  loop do
22
22
  sleep Configuration.processor[:heartbeat_cycle_in_s]
23
23
  publish(heartbeat)
24
- EventHub.logger.info('Heartbeat has sent a beat')
24
+ EventHub.logger.info("Heartbeat has sent a beat")
25
25
  end
26
26
  end
27
27
 
28
28
  def cleanup
29
- EventHub.logger.info('Heartbeat is cleaning up...')
30
- publish(heartbeat(action: 'stopped'))
31
- EventHub.logger.info('Heartbeat has sent a [stopped] beat')
29
+ EventHub.logger.info("Heartbeat is cleaning up...")
30
+ publish(heartbeat(action: "stopped"))
31
+ EventHub.logger.info("Heartbeat has sent a [stopped] beat")
32
32
  end
33
33
 
34
34
  private
@@ -43,29 +43,29 @@ module EventHub
43
43
  success = channel.wait_for_confirms
44
44
 
45
45
  unless success
46
- raise 'Published heartbeat message has '\
47
- 'not been confirmed by the server'
46
+ raise "Published heartbeat message has "\
47
+ "not been confirmed by the server"
48
48
  end
49
49
  ensure
50
- connection.close if connection
50
+ connection&.close
51
51
  end
52
52
 
53
- def heartbeat(args = { action: 'running' })
53
+ def heartbeat(args = {action: "running"})
54
54
  message = EventHub::Message.new
55
- message.origin_module_id = EventHub::Configuration.name
56
- message.origin_type = 'processor'
57
- message.origin_site_id = 'global'
55
+ message.origin_module_id = EventHub::Configuration.name
56
+ message.origin_type = "processor"
57
+ message.origin_site_id = "global"
58
58
 
59
- message.process_name = 'event_hub.heartbeat'
59
+ message.process_name = "event_hub.heartbeat"
60
60
 
61
61
  now = Time.now
62
62
 
63
63
  # message structure needs more changes
64
64
  message.body = {
65
65
  version: @processor_instance.send(:version),
66
- action: args[:action],
67
- pid: Process.pid,
68
- process_name: 'event_hub.heartbeat',
66
+ action: args[:action],
67
+ pid: Process.pid,
68
+ process_name: "event_hub.heartbeat",
69
69
  heartbeat: {
70
70
  started: now_stamp(started_at),
71
71
  stamp_last_beat: now_stamp(now),
@@ -90,11 +90,11 @@ module EventHub
90
90
  end
91
91
 
92
92
  def addresses
93
- interfaces = Socket.getifaddrs.select do |interface|
93
+ interfaces = Socket.getifaddrs.select { |interface|
94
94
  !interface.addr.ipv4_loopback? && !interface.addr.ipv6_loopback?
95
- end
95
+ }
96
96
 
97
- interfaces.map do |interface|
97
+ interfaces.map { |interface|
98
98
  begin
99
99
  {
100
100
  interface: interface.name,
@@ -104,7 +104,7 @@ module EventHub
104
104
  rescue
105
105
  nil # will be ignored
106
106
  end
107
- end.compact
107
+ }.compact
108
108
  end
109
109
 
110
110
  def messages_statistics
@@ -15,14 +15,14 @@ module EventHub
15
15
  end
16
16
 
17
17
  def start
18
- EventHub.logger.info('Listener is starting...')
18
+ EventHub.logger.info("Listener is starting...")
19
19
  EventHub::Configuration.processor[:listener_queues].each_with_index do |queue_name, index|
20
20
  async.listen(queue_name: queue_name, index: index)
21
21
  end
22
22
  end
23
23
 
24
24
  def restart
25
- raise 'Listener is restarting...'
25
+ raise "Listener is restarting..."
26
26
  end
27
27
 
28
28
  def listen(args = {})
@@ -30,7 +30,7 @@ module EventHub
30
30
  EventHub.logger.info("Listening to queue [#{queue_name}]")
31
31
  consumer.on_delivery do |delivery_info, metadata, payload|
32
32
  EventHub.logger.info("#{queue_name}: [#{delivery_info.delivery_tag}]"\
33
- ' delivery')
33
+ " delivery")
34
34
 
35
35
  @processor_instance.statistics.measure(payload.size) do
36
36
  handle_payload(payload: payload,
@@ -38,25 +38,21 @@ module EventHub
38
38
  queue_name: queue_name,
39
39
  content_type: metadata[:content_type],
40
40
  priority: metadata[:priority],
41
- delivery_tag: delivery_info.delivery_tag
42
- )
41
+ delivery_tag: delivery_info.delivery_tag)
43
42
  channel.acknowledge(delivery_info.delivery_tag, false)
44
43
  end
45
44
 
46
45
  EventHub.logger.info("#{queue_name}: [#{delivery_info.delivery_tag}]"\
47
- ' acknowledged')
46
+ " acknowledged")
48
47
  end
49
48
  queue.subscribe_with(consumer, block: false)
50
49
  end
51
-
52
50
  rescue => error
53
51
  EventHub.logger.error("Unexpected exception: #{error}. It should restart now with this exception...")
54
52
  raise
55
53
  end
56
54
 
57
55
  def with_listen(args = {}, &block)
58
- connection_string, connection_properties = connection_properties
59
-
60
56
  connection = create_bunny_connection
61
57
  connection.start
62
58
  queue_name = args[:queue_name]
@@ -65,11 +61,11 @@ module EventHub
65
61
  channel.prefetch(1)
66
62
  queue = channel.queue(queue_name, durable: true)
67
63
  consumer = EventHub::Consumer.new(channel,
68
- queue,
69
- EventHub::Configuration.name +
70
- '-' +
71
- args[:index].to_s,
72
- false)
64
+ queue,
65
+ EventHub::Configuration.name +
66
+ "-" +
67
+ args[:index].to_s,
68
+ false)
73
69
  yield connection, channel, consumer, queue, queue_name
74
70
  end
75
71
 
@@ -86,18 +82,18 @@ module EventHub
86
82
  # return invalid messages to dispatcher
87
83
  if message.invalid?
88
84
  response_messages << message
89
- EventHub.logger.info("-> #{message.to_s} => return invalid to dispatcher")
85
+ EventHub.logger.info("-> #{message} => return invalid to dispatcher")
90
86
  else
91
87
  begin
92
88
  response_messages = @processor_instance.send(:handle_message,
93
- message,
94
- pass_arguments(args))
89
+ message,
90
+ pass_arguments(args))
95
91
  rescue => exception
96
92
  # this catches unexpected exceptions in handle message method
97
93
  # deadletter the message via dispatcher
98
94
  message.status_code = EventHub::STATUS_DEADLETTER
99
95
  message.status_message = exception.to_s
100
- EventHub.logger.info("-> #{message.to_s} => return exception to dispatcher")
96
+ EventHub.logger.info("-> #{message} => return exception to dispatcher")
101
97
  response_messages << message
102
98
  end
103
99
  end
@@ -109,15 +105,15 @@ module EventHub
109
105
 
110
106
  def pass_arguments(args = {})
111
107
  keys_to_pass = [:queue_name, :content_type, :priority, :delivery_tag]
112
- args.select{ |key| keys_to_pass.include?(key) }
108
+ args.select { |key| keys_to_pass.include?(key) }
113
109
  end
114
110
 
115
111
  def cleanup
116
- EventHub.logger.info('Listener is cleaning up...')
112
+ EventHub.logger.info("Listener is cleaning up...")
117
113
  # close all open connections
118
114
  return unless @connections
119
115
  @connections.values.each do |connection|
120
- connection.close if connection
116
+ connection&.close
121
117
  end
122
118
  end
123
119
 
@@ -7,7 +7,7 @@ module EventHub
7
7
  finalizer :cleanup
8
8
 
9
9
  def initialize
10
- EventHub.logger.info('Publisher is starting...')
10
+ EventHub.logger.info("Publisher is starting...")
11
11
  @connection = nil
12
12
  end
13
13
 
@@ -31,16 +31,16 @@ module EventHub
31
31
  success = channel.wait_for_confirms
32
32
 
33
33
  unless success
34
- raise 'Published message from Listener actor '\
35
- 'has not been confirmed by the server'
34
+ raise "Published message from Listener actor "\
35
+ "has not been confirmed by the server"
36
36
  end
37
- ensure
38
- channel.close if channel
37
+ ensure
38
+ channel&.close
39
39
  end
40
40
 
41
41
  def cleanup
42
- EventHub.logger.info('Publisher is cleaning up...')
43
- @connection.close if @connection
42
+ EventHub.logger.info("Publisher is cleaning up...")
43
+ @connection&.close
44
44
  end
45
45
  end
46
46
  end
@@ -7,20 +7,19 @@ module EventHub
7
7
  finalizer :cleanup
8
8
 
9
9
  def initialize
10
- EventHub.logger.info('Watchdog is starting...')
10
+ EventHub.logger.info("Watchdog is starting...")
11
11
  async.start
12
12
  end
13
13
 
14
14
  def start
15
15
  loop do
16
- EventHub.logger.info('Running watchdog...')
17
16
  watch
18
17
  sleep Configuration.processor[:watchdog_cycle_in_s]
19
18
  end
20
19
  end
21
20
 
22
21
  def cleanup
23
- EventHub.logger.info('Watchdog is cleaning up...')
22
+ EventHub.logger.info("Watchdog is cleaning up...")
24
23
  end
25
24
 
26
25
  private
@@ -36,7 +35,7 @@ module EventHub
36
35
  end
37
36
  end
38
37
  ensure
39
- connection.close if connection
38
+ connection&.close
40
39
  end
41
40
  end
42
41
  end
data/lib/eventhub/base.rb CHANGED
@@ -1,36 +1,29 @@
1
- require 'uuidtools'
2
- require 'json'
3
- require 'base64'
4
- require 'optparse'
1
+ require "uuidtools"
2
+ require "json"
3
+ require "base64"
4
+ require "optparse"
5
5
 
6
- require 'eventhub/components'
7
- require 'logstash-logger'
8
- require 'bunny'
6
+ require "eventhub/components"
7
+ require "logstash-logger"
8
+ require "bunny"
9
+ require "celluloid"
9
10
 
10
- # Maybe needs refactoring in future versions ?!
11
- if ENV['RSPEC_PROCESSOR2']
12
- require 'celluloid'
13
- else
14
- # celluloid is booting automatically
15
- require 'celluloid/current'
16
- end
17
-
18
- require_relative 'version'
19
- require_relative 'constant'
20
- require_relative 'base_exception'
21
- require_relative 'logger'
22
- require_relative 'helper'
23
- require_relative 'sleeper'
24
- require_relative 'hash_extensions'
25
- require_relative 'configuration'
26
- require_relative 'message'
27
- require_relative 'statistics'
28
- require_relative 'consumer'
29
- require_relative 'actor_heartbeat'
30
- require_relative 'actor_watchdog'
31
- require_relative 'actor_publisher'
32
- require_relative 'actor_listener'
33
- require_relative 'processor2'
11
+ require_relative "version"
12
+ require_relative "constant"
13
+ require_relative "base_exception"
14
+ require_relative "logger"
15
+ require_relative "helper"
16
+ require_relative "sleeper"
17
+ require_relative "hash_extensions"
18
+ require_relative "configuration"
19
+ require_relative "message"
20
+ require_relative "statistics"
21
+ require_relative "consumer"
22
+ require_relative "actor_heartbeat"
23
+ require_relative "actor_watchdog"
24
+ require_relative "actor_publisher"
25
+ require_relative "actor_listener"
26
+ require_relative "processor2"
34
27
 
35
28
  Celluloid.logger = nil
36
29
  Celluloid.exception_handler { |ex| EventHub.logger.error "Exception occured: #{ex}" }
@@ -3,9 +3,9 @@ module EventHub
3
3
  # BaseException class
4
4
  class BaseException < RuntimeError
5
5
  attr_accessor :code, :message
6
- def initialize(message=nil, code=EventHub::STATUS_DEADLETTER)
6
+ def initialize(message = nil, code = EventHub::STATUS_DEADLETTER)
7
7
  @message = message
8
- @code = code
8
+ @code = code
9
9
  super(@message)
10
10
  end
11
11
  end
@@ -6,16 +6,16 @@ module EventHub
6
6
  extend self
7
7
  extend Helper
8
8
 
9
- attr_reader :name # name of processor
10
- attr_reader :environment # environment the processor is running
11
- attr_reader :detached # run processor run as a daemon
12
- attr_reader :config_file # name of configuration file
13
- attr_reader :config_data # data from configuration file
14
-
15
- @name = 'undefined'
16
- @environment = 'development'
9
+ attr_reader :name # name of processor
10
+ attr_reader :environment # environment the processor is running
11
+ attr_reader :detached # run processor run as a daemon
12
+ attr_reader :config_file # name of configuration file
13
+ attr_reader :config_data # data from configuration file
14
+
15
+ @name = "undefined"
16
+ @environment = "development"
17
17
  @detached = false
18
- @config_file = File.join(Dir.getwd, 'config', "#{@name}.json")
18
+ @config_file = File.join(Dir.getwd, "config", "#{@name}.json")
19
19
  @config_data = {}
20
20
 
21
21
  # set name of processor
@@ -24,32 +24,32 @@ module EventHub
24
24
  end
25
25
 
26
26
  def reset
27
- @name = 'undefined'
28
- @environment = 'development'
27
+ @name = "undefined"
28
+ @environment = "development"
29
29
  @detached = false
30
- @config_file = File.join(Dir.getwd, 'config', "#{@name}.json")
30
+ @config_file = File.join(Dir.getwd, "config", "#{@name}.json")
31
31
  @config_data = {}
32
32
  end
33
33
 
34
34
  # parse options from argument list
35
35
  def parse_options(argv = ARGV)
36
- @config_file = File.join(Dir.getwd, 'config', "#{@name}.json")
36
+ @config_file = File.join(Dir.getwd, "config", "#{@name}.json")
37
37
 
38
- OptionParser.new do |opts|
39
- note = 'Define environment'
40
- opts.on('-e', '--environment ENVIRONMENT', note) do |environment|
38
+ OptionParser.new { |opts|
39
+ note = "Define environment"
40
+ opts.on("-e", "--environment ENVIRONMENT", note) do |environment|
41
41
  @environment = environment
42
42
  end
43
43
 
44
- opts.on('-d', '--detached', 'Run processor detached as a daemon') do
44
+ opts.on("-d", "--detached", "Run processor detached as a daemon") do
45
45
  @detached = true
46
46
  end
47
47
 
48
- note = 'Define configuration file'
49
- opts.on('-c', '--config CONFIG', note) do |config|
48
+ note = "Define configuration file"
49
+ opts.on("-c", "--config CONFIG", note) do |config|
50
50
  @config_file = config
51
51
  end
52
- end.parse!(argv)
52
+ }.parse!(argv)
53
53
 
54
54
  true
55
55
  rescue OptionParser::InvalidOption => e
@@ -71,7 +71,7 @@ module EventHub
71
71
  new_data = JSON.parse(File.read(@config_file), symbolize_names: true)
72
72
  rescue => e
73
73
  EventHub.logger.warn("Exception while loading configuration file: #{e}")
74
- EventHub.logger.info('Using default configuration values')
74
+ EventHub.logger.info("Using default configuration values")
75
75
  end
76
76
 
77
77
  deep_merge!(@config_data, default_configuration)
@@ -94,13 +94,18 @@ module EventHub
94
94
  fail(NoMethodError, "unknown configuration [#{name}]", caller)
95
95
  end
96
96
 
97
+ def respond_to_missing?(name, include_private = false)
98
+ return true if @config_data[name.to_sym]
99
+ false
100
+ end
101
+
97
102
  def default_configuration
98
103
  {
99
104
  server: {
100
- user: 'guest',
101
- password: 'guest',
102
- host: 'localhost',
103
- vhost: 'event_hub',
105
+ user: "guest",
106
+ password: "guest",
107
+ host: "localhost",
108
+ vhost: "event_hub",
104
109
  port: 5672,
105
110
  tls: false,
106
111
  tls_cert: nil,