rservicebus2 0.2.6 → 0.2.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rservicebus2.rb +6 -4
  3. data/lib/rservicebus2/agent.rb +7 -4
  4. data/lib/rservicebus2/appresource.rb +8 -9
  5. data/lib/rservicebus2/appresource/awsdynamodb.rb +3 -3
  6. data/lib/rservicebus2/appresource/awss3.rb +3 -3
  7. data/lib/rservicebus2/appresource/awssqs.rb +27 -0
  8. data/lib/rservicebus2/appresource/dir.rb +3 -0
  9. data/lib/rservicebus2/appresource/file.rb +2 -0
  10. data/lib/rservicebus2/appresource/fluiddb.rb +3 -0
  11. data/lib/rservicebus2/appresource/fluiddb2.rb +3 -1
  12. data/lib/rservicebus2/appresource_configure.rb +11 -4
  13. data/lib/rservicebus2/audit.rb +4 -2
  14. data/lib/rservicebus2/circuitbreaker.rb +4 -2
  15. data/lib/rservicebus2/config.rb +44 -35
  16. data/lib/rservicebus2/cron_manager.rb +6 -1
  17. data/lib/rservicebus2/endpointmapping.rb +20 -14
  18. data/lib/rservicebus2/errormessage.rb +3 -2
  19. data/lib/rservicebus2/handler_loader.rb +35 -28
  20. data/lib/rservicebus2/handler_manager.rb +31 -25
  21. data/lib/rservicebus2/helper_functions.rb +20 -15
  22. data/lib/rservicebus2/host.rb +63 -124
  23. data/lib/rservicebus2/message.rb +11 -19
  24. data/lib/rservicebus2/message/statisticoutput.rb +2 -0
  25. data/lib/rservicebus2/message/subscription.rb +2 -0
  26. data/lib/rservicebus2/message/verboseoutput.rb +2 -0
  27. data/lib/rservicebus2/monitor.rb +7 -8
  28. data/lib/rservicebus2/monitor/awss3.rb +3 -1
  29. data/lib/rservicebus2/monitor/awssqs.rb +34 -0
  30. data/lib/rservicebus2/monitor/dir.rb +25 -23
  31. data/lib/rservicebus2/monitor/dirnotifier.rb +3 -0
  32. data/lib/rservicebus2/monitor/message.rb +2 -0
  33. data/lib/rservicebus2/monitor/xmldir.rb +2 -0
  34. data/lib/rservicebus2/monitor_configure.rb +47 -34
  35. data/lib/rservicebus2/mq.rb +27 -30
  36. data/lib/rservicebus2/mq/beanstalk.rb +5 -1
  37. data/lib/rservicebus2/resource_manager.rb +14 -19
  38. data/lib/rservicebus2/saga/data.rb +1 -1
  39. data/lib/rservicebus2/saga/manager.rb +2 -2
  40. data/lib/rservicebus2/saga_loader.rb +27 -24
  41. data/lib/rservicebus2/saga_storage.rb +5 -4
  42. data/lib/rservicebus2/sendat_manager.rb +5 -3
  43. data/lib/rservicebus2/sendat_storage.rb +5 -3
  44. data/lib/rservicebus2/sendat_storage/file.rb +6 -2
  45. data/lib/rservicebus2/sendat_storage/inmemory.rb +2 -0
  46. data/lib/rservicebus2/state_manager.rb +5 -4
  47. data/lib/rservicebus2/state_storage.rb +7 -6
  48. data/lib/rservicebus2/statistic_manager.rb +7 -3
  49. data/lib/rservicebus2/subscription_manager.rb +7 -5
  50. data/lib/rservicebus2/subscription_storage.rb +6 -5
  51. data/lib/rservicebus2/subscription_storage/file.rb +5 -18
  52. data/lib/rservicebus2/subscription_storage_configure.rb +2 -0
  53. data/lib/rservicebus2/transporter.rb +63 -52
  54. metadata +19 -18
  55. data/lib/rservicebus2/stats.rb +0 -68
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RServiceBus2
2
4
  # Class to hold message subscriptions
3
5
  class MessageSubscription
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RServiceBus2
2
4
  class MessageVerboseOutputOn
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RServiceBus2
2
4
  # Monitor
3
5
  class Monitor
@@ -5,12 +7,12 @@ module RServiceBus2
5
7
 
6
8
  # The method which actually connects to the resource.
7
9
  def connect(_uri)
8
- fail 'Method, connect, needs to be implemented for resource'
10
+ raise 'Method, connect, needs to be implemented for resource'
9
11
  end
10
12
 
11
13
  # The method which actually connects to the resource.
12
14
  def look
13
- fail 'Method, Look, needs to be implemented for the Monitor'
15
+ raise 'Method, Look, needs to be implemented for the Monitor'
14
16
  end
15
17
 
16
18
  def _connect
@@ -26,7 +28,6 @@ module RServiceBus2
26
28
  def initialize(bus, name, uri)
27
29
  @bus = bus
28
30
  new_anonymous_class = Class.new(MonitorMessage)
29
- puts "name: #{name}"
30
31
  Object.const_set(name, new_anonymous_class)
31
32
  @msg_type = Object.const_get(name)
32
33
 
@@ -35,8 +36,7 @@ module RServiceBus2
35
36
  end
36
37
 
37
38
  # A notification that allows cleanup
38
- def finished
39
- end
39
+ def finished; end
40
40
 
41
41
  # At least called in the Host rescue block, to ensure all network links
42
42
  # are healthy
@@ -44,9 +44,8 @@ module RServiceBus2
44
44
  begin
45
45
  finished
46
46
  rescue StandardError => e
47
- puts '** Monitor. An error was raised while closing connection to, ' +
48
- @uri
49
- puts 'Message: ' + e.message
47
+ puts "** Monitor. An error was raised while closing connection to, #{@uri}"
48
+ puts "Message: #{e.message}"
50
49
  puts e.backtrace
51
50
  end
52
51
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'aws-sdk-s3'
2
4
 
3
5
  module RServiceBus2
@@ -36,7 +38,7 @@ module RServiceBus2
36
38
  file_processed = 0
37
39
  max_files_processed = 2
38
40
 
39
- objects = @s3_client.list_objects_v2( bucket: @bucket_name, max_keys: max_files_processed).contents
41
+ objects = @s3_client.list_objects_v2(bucket: @bucket_name, max_keys: max_files_processed).contents
40
42
 
41
43
  objects.each do |object|
42
44
  RServiceBus2.log "Ready to process, #{object.key}"
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aws-sdk-sqs'
4
+ require 'aws-sdk-sts'
5
+
6
+ module RServiceBus2
7
+ # Monitor S3 Bucket for objects
8
+ class MonitorAWSSQS < Monitor
9
+ def connect(uri)
10
+ queue_name = uri.path.sub('/', '')
11
+
12
+ region = uri.host
13
+
14
+ sts_client = Aws::STS::Client.new(region: region)
15
+ caller_identity_account = sts_client.get_caller_identity.account
16
+
17
+ @queue_url = "https://sqs.#{region}.amazonaws.com/#{caller_identity_account}/#{queue_name}"
18
+ @sqs_client = Aws::SQS::Client.new(region: region)
19
+ end
20
+
21
+ def look
22
+ response = @sqs_client.receive_message(queue_url: @queue_url, max_number_of_messages: 1)
23
+ response.messages.each do |message|
24
+ send(message.body, URI.parse(CGI.escape(@queue_url)))
25
+ @sqs_client.delete_message(
26
+ {
27
+ queue_url: @queue_url,
28
+ receipt_handle: message.receipt_handle
29
+ }
30
+ )
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,38 +1,39 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cgi'
2
4
  require 'zip/zip'
3
5
  require 'zlib'
4
6
 
5
7
  module RServiceBus2
6
8
  # Monitor Directory for files
9
+
7
10
  # rubocop:disable Metrics/ClassLength
8
11
  class MonitorDir < Monitor
9
- def connect(uri)
12
+ def input_dir(uri)
10
13
  # Pass the path through the Dir object to check syntax on startup
11
- begin
12
- input_dir = Dir.new(uri.path)
13
- unless File.writable?(uri.path)
14
- puts "***** Directory is not writable, #{uri.path}."
15
- puts "***** Make the directory, #{uri.path}, writable and try again."
16
- abort
17
- end
18
- rescue Errno::ENOENT
19
- puts "***** Directory does not exist, #{uri.path}."
20
- puts "***** Create the directory, #{uri.path}, and try again."
21
- puts "***** eg, mkdir #{uri.path}"
22
- abort
23
- rescue Errno::ENOTDIR
24
- puts "***** The specified path does not point to a directory,
25
- #{uri.path}."
26
- puts "***** Either repoint path to a directory, or remove, #{uri.path},
27
- and create it as a directory."
28
- puts "***** eg, rm #{uri.path} && mkdir #{uri.path}"
29
- abort
30
- end
14
+ return Dir.new(uri.path) if File.writable?(uri.path)
15
+
16
+ puts "***** Directory is not writable, #{uri.path}.\n" \
17
+ "***** Make the directory, #{uri.path}, writable and try again."
18
+ abort
19
+ rescue Errno::ENOENT
20
+ puts "***** Directory does not exist, #{uri.path}.\n" \
21
+ "***** Create the directory, #{uri.path}, and try again.\n" \
22
+ "***** eg, mkdir #{uri.path}"
23
+ abort
24
+ rescue Errno::ENOTDIR
25
+ puts "***** The specified path does not point to a directory, #{uri.path}.\n" \
26
+ "***** Either repoint path to a directory, or remove, #{uri.path}, and create it as a directory.\n" \
27
+ "***** eg, rm #{uri.path} && mkdir #{uri.path}"
28
+ abort
29
+ end
31
30
 
32
- @path = input_dir.path
31
+ def connect(uri)
32
+ @path = input_dir(uri).path
33
33
  @input_filter = []
34
34
 
35
35
  return if uri.query.nil?
36
+
36
37
  parts = CGI.parse(uri.query)
37
38
  @querystringparts = parts
38
39
  if parts.key?('archive')
@@ -124,7 +125,7 @@ module RServiceBus2
124
125
 
125
126
  unless @archivedir.nil?
126
127
  basename = File.basename(file_path)
127
- new_file_path = "#{@archivedir}/#{basename}.#{DateTime.now.strftime('%Y%m%d%H%M%S%L')}.zip"
128
+ new_file_path = "#{@archivedir}/#{basename}.#{Time.now.strftime('%Y%m%d%H%M%S%L')}.zip"
128
129
  RServiceBus2.log "Writing to archive, #{new_file_path}"
129
130
 
130
131
  Zip::ZipOutputStream.open(new_file_path) do |zos|
@@ -141,4 +142,5 @@ module RServiceBus2
141
142
  end
142
143
  end
143
144
  end
145
+ # rubocop:enable Metrics/ClassLength
144
146
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cgi'
2
4
  require 'fileutils'
3
5
  require 'pathname'
@@ -6,6 +8,7 @@ module RServiceBus2
6
8
  # Monitor for Directory
7
9
  class MonitorDirNotifier < Monitor
8
10
  attr_reader :path, :processing_folder, :filter
11
+
9
12
  def connect(uri)
10
13
  # Pass the path through the Dir object to check syntax on startup
11
14
  begin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RServiceBus2
2
4
  # Monitor Message
3
5
  class MonitorMessage
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rservicebus2/monitor/dir'
2
4
  require 'xmlsimple'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rservicebus2/monitor'
2
4
  require 'rservicebus2/monitor/message'
3
5
 
@@ -16,53 +18,64 @@ module RServiceBus2
16
18
  @resource_list = {}
17
19
  end
18
20
 
21
+ def conditionally_set_app_resource(monitor, key, val)
22
+ monitor.instance_variable_set("@#{key}", val.resource)
23
+ @resource_list[monitor.class.name] = [] if @resource_list[monitor.class.name].nil?
24
+ @resource_list[monitor.class.name] << val
25
+ @host.log "App resource attribute, #{key}, set for: #{monitor.class.name}"
26
+ end
27
+
19
28
  # Assigns appropriate resources to writable attributes in the handler that
20
29
  # match keys in the resource hash
21
30
  # @param [RServiceBus2::Handler] handler
22
- def set_app_resources(monitor)
31
+ def conditionally_set_app_resources(monitor)
23
32
  RServiceBus2.rlog "Checking app resources for: #{monitor.class.name}"
24
- RServiceBus2.rlog "If your attribute is not getting set, check that it is
25
- in the 'attr_accessor' list"
26
- @resource_manager.get_all.each do |k, v|
33
+ RServiceBus2.rlog "If your attribute is not getting set, check that it is in the 'attr_accessor' list"
34
+ @resource_manager.all.each do |k, v|
27
35
  next unless monitor.class.method_defined?(k)
28
36
 
29
- monitor.instance_variable_set("@#{k}", v.get_resource)
30
- @resource_list[monitor.class.name] = [] if
31
- @resource_list[monitor.class.name].nil?
32
- @resource_list[monitor.class.name] << v
33
- @host.log "App resource attribute, #{k}, set for: " +
34
- monitor.class.name
37
+ conditionally_set_app_resource(monitor, k, v)
35
38
  end
36
39
  self
37
40
  end
38
41
 
39
- def get_monitors(env)
40
- monitors = []
42
+ # rubocop:disable Metrics/MethodLength
43
+ def load_monitor(key, val)
44
+ name = key.sub('RSBOB_', '')
45
+ uri = URI.parse(val)
46
+ monitor = nil
47
+ case uri.scheme
48
+ when 'dir'
49
+ require 'rservicebus2/monitor/dir'
50
+ monitor = MonitorDir.new(@host, name, uri)
51
+ when 'awss3'
52
+ require 'rservicebus2/monitor/awss3'
53
+ monitor = MonitorAWSS3.new(@host, name, uri)
54
+ when 'awssqs'
55
+ require 'rservicebus2/monitor/awssqs'
56
+ monitor = MonitorAWSSQS.new(@host, name, uri)
57
+ when 'dirnotifier'
58
+ require 'rservicebus2/monitor/dirnotifier'
59
+ monitor = MonitorDirNotifier.new(@host, name, uri)
60
+ else
61
+ abort("Scheme, #{uri.scheme}, not recognised when configuring
62
+ Monitor, #{key}=#{val}")
63
+ end
64
+ monitor
65
+ end
66
+ # rubocop:enable Metrics/MethodLength
67
+
68
+ def monitors(env)
69
+ list = []
41
70
 
42
71
  env.each do |k, v|
43
- if v.is_a?(String) && k.start_with?('RSBOB_')
44
- uri = URI.parse(v)
45
- name = k.sub('RSBOB_', '')
46
- monitor = nil
47
- case uri.scheme
48
- when 'dir'
49
- require 'rservicebus2/monitor/dir'
50
- monitor = MonitorDir.new(@host, name, uri)
51
- when 'awss3'
52
- require 'rservicebus2/monitor/awss3'
53
- monitor = MonitorAWSS3.new(@host, name, uri)
54
- when 'dirnotifier'
55
- require 'rservicebus2/monitor/dirnotifier'
56
- monitor = MonitorDirNotifier.new(@host, name, uri)
57
- else
58
- abort("Scheme, #{uri.scheme}, not recognised when configuring
59
- Monitor, #{k}=#{v}")
60
- end
61
- set_app_resources(monitor)
62
- monitors << monitor
63
- end
72
+ next unless v.is_a?(String) && k.start_with?('RSBOB_')
73
+
74
+ monitor = load_monitor(k, v)
75
+ conditionally_set_app_resources(monitor)
76
+ list << monitor
64
77
  end
65
- monitors
78
+ list
66
79
  end
67
80
  end
68
81
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'uri'
2
4
 
3
5
  module RServiceBus2
@@ -10,6 +12,7 @@ module RServiceBus2
10
12
  class MQ
11
13
  attr_reader :local_queue_name
12
14
 
15
+ # rubocop:disable Metrics/MethodLength
13
16
  def self.get
14
17
  mq_string = RServiceBus2.get_value('RSBMQ', 'beanstalk://localhost')
15
18
  uri = URI.parse(mq_string)
@@ -34,31 +37,26 @@ module RServiceBus2
34
37
 
35
38
  mq
36
39
  end
40
+ # rubocop:enable Metrics/MethodLength
37
41
 
38
42
  # Resources are attached, and are be specified using the URI syntax
39
43
  # @param [URI] uri the type and location of queue,
40
44
  # eg beanstalk://127.0.0.1/foo
41
45
  # @param [Integer] timeout the amount of time to wait for a msg to arrive
46
+
47
+ # rubocop:disable Metrics/MethodLength
42
48
  def initialize(uri)
43
- if uri.is_a? URI
44
- @uri = uri
45
- else
46
- puts 'uri must be a valid URI'
47
- abort
48
- end
49
+ abort 'Paramter to mq must be a valid URI' unless uri.is_a? URI
49
50
 
50
- if uri.path == '' || uri.path == '/'
51
- @local_queue_name = RServiceBus2.get_value('APPNAME', 'RServiceBus')
52
- else
53
- @local_queue_name = uri.path
54
- @local_queue_name[0] = ''
55
- end
51
+ @uri = uri
52
+ @local_queue_name = uri.path
53
+ @local_queue_name[0] = '' if @local_queue_name[0] == '/'
54
+ @local_queue_name = RServiceBus2.get_value('APPNAME', 'RServiceBus') if @local_queue_name == ''
56
55
 
57
56
  if @local_queue_name == ''
58
- puts "@local_queue_name: #{@local_queue_name}"
59
- puts 'Queue name must be supplied '
60
- puts "*** uri, #{uri}, needs to contain a queue name"
61
- puts '*** the structure is scheme://host[:port]/queuename'
57
+ puts 'Queue name must be supplied ' \
58
+ "*** uri, #{uri}, needs to contain a queue name" \
59
+ '*** the structure is scheme://host[:port]/queuename'
62
60
  abort
63
61
  end
64
62
 
@@ -66,42 +64,41 @@ module RServiceBus2
66
64
  connect(uri.host, uri.port)
67
65
  subscribe(@local_queue_name)
68
66
  end
67
+ # rubocop:enable Metrics/MethodLength
69
68
 
70
69
  # Connect to the broker
71
70
  # @param [String] host machine runnig the mq
72
71
  # @param [String] port port the mq is running on
73
72
  def connect(_host, _port)
74
- fail 'Method, connect, needs to be implemented'
73
+ raise 'Method, connect, needs to be implemented'
75
74
  end
76
75
 
77
76
  # Connect to the receiving queue
78
77
  # @param [String] queuename name of the receiving queue
79
78
  def subscribe(_queuename)
80
- fail 'Method, subscribe, needs to be implemented'
79
+ raise 'Method, subscribe, needs to be implemented'
81
80
  end
82
81
 
83
82
  # Get next msg from queue
84
83
  def pop
85
- fail 'Method, pop, needs to be implemented'
84
+ raise 'Method, pop, needs to be implemented'
86
85
  end
87
86
 
88
87
  # "Commit" the pop
89
88
  def ack
90
- fail 'Method, ack, needs to be implemented'
89
+ raise 'Method, ack, needs to be implemented'
91
90
  end
92
91
 
93
92
  # At least called in the Host rescue block, to ensure all network links are
94
93
  # healthy
95
94
  # @param [String] queue_name name of the queue to which the msg should be sent
96
95
  # @param [String] msg msg to be sent
97
- def send(queue_name, msg)
98
- begin
99
- @connection.close
100
- rescue
101
- puts 'AppResource. An error was raised while closing connection to, ' + @uri.to_s
102
- end
103
-
104
- end
105
-
106
- end
96
+ def send(_queue_name, _msg)
97
+ @connection.close
98
+ rescue StandardError => e
99
+ puts "AppResource. An error was raised while closing connection to, #{@uri}"
100
+ puts "Error: #{e.message}"
101
+ puts "Backtrace: #{e.backtrace}"
102
+ end
103
+ end
107
104
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'beanstalk-client'
2
4
  require 'rservicebus2/mq'
3
5
 
@@ -34,6 +36,7 @@ module RServiceBus2
34
36
  abort
35
37
  end
36
38
  end
39
+ # rubocop:enable Metrics/AbcSize,Metrics/MethodLength
37
40
 
38
41
  def subscribe(queuename)
39
42
  @beanstalk.watch(queuename)
@@ -45,6 +48,7 @@ module RServiceBus2
45
48
  @job = @beanstalk.reserve @timeout
46
49
  rescue StandardError => e
47
50
  raise NoMsgToProcess if e.message == 'TIMED_OUT'
51
+
48
52
  raise e
49
53
  end
50
54
  @job.body
@@ -63,7 +67,7 @@ module RServiceBus2
63
67
  if msg.length > @max_job_size
64
68
  puts '***Attempting to send a msg which will not fit on queue.'
65
69
  puts "***Msg size, #{msg.length}, max msg size, #{@max_job_size}."
66
- fail JobTooBigError, "Msg size, #{msg.length}, max msg size,
70
+ raise JobTooBigError, "Msg size, #{msg.length}, max msg size,
67
71
  #{@max_job_size}"
68
72
  end
69
73
  @beanstalk.use(queue_name)