rservicebus2 0.2.14 → 0.2.20

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb17f3e3c5855d25725fd906122c5880299c33ef25a585d445b1ca63eb3b0a79
4
- data.tar.gz: b950f8c099a79b02837dc6c1382ae4f36eb20d6b35f9c7e06f3351ac11804803
3
+ metadata.gz: f586d7a257549f1a8bbac85940e7740bc6927928b75e3254254cf1a945aefa38
4
+ data.tar.gz: 3e2352c5ddebf9cb4583a67106e4286a54f0b75f67c0fa1f485b56bd70c1dd94
5
5
  SHA512:
6
- metadata.gz: ebb2ef88679f5827b905fc50f604c41dacbaaecbf5878181c0ce46801d9cb24d8df060ef4c39ef37f6bfd130a7dc5c0724f135d3905941841ba0470eaee4eb4f
7
- data.tar.gz: 57c5279177ead71990a756c142f5ac17b2306116e359d4e7edcad448180ad5523c3f8132e024dfbf034b7cb30c8e790788990c00c01a825650eacadc981b1cbc
6
+ metadata.gz: efbdcb52173f9caff80c659e2aae973deeaef5d9cc5adf31d9d251f8c88ef6cf1b212514ed07a88ab36efb7e5e84b83d1938710e5b50ae50049b0b04907df325
7
+ data.tar.gz: 5aeed54b1b619ba5f6b6a2c9221e868770575f88c18f3426ff23ee46abfc7ff62424c5a3a1609e5487bb36e0b0f1b5edfa09ac8cf920b64a4d5a385f3c26434f
@@ -13,7 +13,8 @@ def return_msg(beanstalk, job, request_nbr)
13
13
 
14
14
  msg_name = payload.match('(\w*)', start_index)[1]
15
15
 
16
- msg = YAML.load(payload)
16
+ msg = RServiceBus2.safe_load(payload)
17
+
17
18
  if msg.last_error_string.nil?
18
19
  puts "*** Requested msg, #{request_nbr}, does not have a sourceQueue to
19
20
  which it can be returned"
@@ -50,7 +50,7 @@ module RServiceBus2
50
50
  def check_for_reply(queue_name)
51
51
  @mq.subscribe(queue_name)
52
52
  body = @mq.pop
53
- @msg = YAML.load(body)
53
+ @msg = RServiceBus2.safe_load(body)
54
54
  @mq.ack
55
55
  @msg.msg
56
56
  end
@@ -33,7 +33,7 @@ module RServiceBus2
33
33
  finished
34
34
  end
35
35
 
36
- # A notification that ocurs after getResource, to allow cleanup
36
+ # Allow for cleanup, outside of transaction semantics
37
37
  def finished
38
38
  @connection.close
39
39
  end
@@ -53,12 +53,18 @@ module RServiceBus2
53
53
  end
54
54
 
55
55
  # Transaction Semantics
56
- def begin; end
56
+ def begin
57
+ RServiceBus2.rlog "#{self.class.name}. Default transaction.begin called"
58
+ end
57
59
 
58
60
  # Transaction Semantics
59
- def commit; end
61
+ def commit
62
+ RServiceBus2.rlog "#{self.class.name}. Default transaction.commit called"
63
+ end
60
64
 
61
65
  # Transaction Semantics
62
- def rollback; end
66
+ def rollback
67
+ RServiceBus2.rlog "#{self.class.name}. Default transaction.rollback called"
68
+ end
63
69
  end
64
70
  end
@@ -11,6 +11,8 @@ module RServiceBus2
11
11
  Aws::DynamoDB::Client.new(region: region)
12
12
  end
13
13
 
14
- def finished; end
14
+ def finished
15
+ RServiceBus2.rlog "#{self.class.name}. Finished"
16
+ end
15
17
  end
16
18
  end
@@ -11,6 +11,8 @@ module RServiceBus2
11
11
  Aws::S3::Client.new(region: region)
12
12
  end
13
13
 
14
- def finished; end
14
+ def finished
15
+ RServiceBus2.rlog "#{self.class.name}. Finished"
16
+ end
15
17
  end
16
18
  end
@@ -22,6 +22,8 @@ module RServiceBus2
22
22
  }
23
23
  end
24
24
 
25
- def finished; end
25
+ def finished
26
+ RServiceBus2.rlog "#{self.class.name}. Finished"
27
+ end
26
28
  end
27
29
  end
@@ -18,8 +18,8 @@ module RServiceBus2
18
18
  def commit
19
19
  @connection.commit
20
20
  end
21
- # Transaction Semantics
22
21
 
22
+ # Transaction Semantics
23
23
  def rollback
24
24
  @connection.rollback
25
25
  end
@@ -140,14 +140,19 @@ module RServiceBus2
140
140
  next if file_path.end_with?('.')
141
141
 
142
142
  msg_name = get_msg_name(file_path)
143
+ RServiceBus2.add_to_permitted_classes(
144
+ msg_name.gsub(/(?<=_|^)(\w)/) { Regexp.last_match(1).upcase }.gsub(/(?:_)(\w)/, '\1')
145
+ )
146
+
143
147
  if File.directory?(file_path)
144
148
  load_handlers_from_second_level_path(msg_name, file_path)
145
- else
146
- # Classify
147
- handler_name = "message_handler_#{msg_name}"
148
- .gsub(/(?<=_|^)(\w)/) { Regexp.last_match(1).upcase }.gsub(/(?:_)(\w)/, '\1')
149
- load_handler(msg_name, file_path, handler_name)
149
+ next
150
150
  end
151
+
152
+ # Classify
153
+ handler_name = "message_handler_#{msg_name}"
154
+ .gsub(/(?<=_|^)(\w)/) { Regexp.last_match(1).upcase }.gsub(/(?:_)(\w)/, '\1')
155
+ load_handler(msg_name, file_path, handler_name)
151
156
  end
152
157
 
153
158
  self
@@ -1,7 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'csv'
4
+
3
5
  # Helper functions
4
6
  module RServiceBus2
7
+ DEFAULT_PERMITTED_CLASSES = 'RServiceBus2::Message,Time,UUIDTools::UUID'
8
+
9
+ def self.permitted_classes
10
+ permitted_classes_string = get_value('PERMITTED_CLASSES', DEFAULT_PERMITTED_CLASSES)
11
+ CSV.parse(permitted_classes_string)[0]
12
+ end
13
+
14
+ def self.add_to_permitted_classes(string)
15
+ ENV['PERMITTED_CLASSES'] = permitted_classes
16
+ .push(string)
17
+ .uniq
18
+ .to_csv
19
+ end
20
+
21
+ def self.safe_load(body)
22
+ YAML.safe_load(body, permitted_classes: permitted_classes)
23
+ end
24
+
5
25
  def self.convert_dto_to_hash(obj)
6
26
  hash = {}
7
27
  obj.instance_variables.each do |var|
@@ -162,7 +162,7 @@ module RServiceBus2
162
162
  body = @mq.pop
163
163
  begin
164
164
  @stats.inc_total_processed
165
- @msg = YAML.load(body)
165
+ @msg = RServiceBus2.safe_load(body)
166
166
  case @msg.msg.class.name
167
167
  when 'RServiceBus2::MessageSubscription'
168
168
  @subscription_manager.add(@msg.msg.event_name,
@@ -252,18 +252,30 @@ module RServiceBus2
252
252
  message_loop = false
253
253
  rescue NoMsgToProcess => e
254
254
  # This exception is just saying there are no messages to process
255
- @queue_for_msgs_to_be_sent_on_complete = []
256
- @monitors.each(&:look)
257
- send_queued_msgs
258
- @queue_for_msgs_to_be_sent_on_complete = nil
259
-
260
- @queue_for_msgs_to_be_sent_on_complete = []
261
- @cron_manager.run
262
- send_queued_msgs
263
- @queue_for_msgs_to_be_sent_on_complete = nil
264
-
265
- @send_at_manager.process
266
- @circuit_breaker.success
255
+ begin
256
+ @queue_for_msgs_to_be_sent_on_complete = []
257
+ @monitors.each(&:look)
258
+ send_queued_msgs
259
+ @queue_for_msgs_to_be_sent_on_complete = nil
260
+
261
+ @queue_for_msgs_to_be_sent_on_complete = []
262
+ @cron_manager.run
263
+ send_queued_msgs
264
+ @queue_for_msgs_to_be_sent_on_complete = nil
265
+
266
+ @send_at_manager.process
267
+ @circuit_breaker.success
268
+ rescue StandardError => e
269
+ if e.message == 'SIGTERM' || e.message == 'SIGINT'
270
+ puts 'Exiting on request ...'
271
+ message_loop = false
272
+ else
273
+ puts '*** This is really unexpected.'
274
+ message_loop = false
275
+ puts "Message: #{e.message}"
276
+ puts e.backtrace
277
+ end
278
+ end
267
279
  rescue StandardError => e
268
280
  if e.message == 'SIGTERM' || e.message == 'SIGINT'
269
281
  puts 'Exiting on request ...'
@@ -55,9 +55,9 @@ module RServiceBus2
55
55
 
56
56
  # @return [Object] The msg to be sent
57
57
  def msg
58
- return YAML.load(Zlib::Inflate.inflate(@_msg)) if @compressed == true
58
+ return RServiceBus2.safe_load(Zlib::Inflate.inflate(@_msg)) if @compressed == true
59
59
 
60
- YAML.load(@_msg)
60
+ RServiceBus2.safe_load(@_msg)
61
61
  rescue ArgumentError => e
62
62
  raise e if e.message.index('undefined class/module ').nil?
63
63
 
@@ -36,7 +36,9 @@ module RServiceBus2
36
36
  end
37
37
 
38
38
  # A notification that allows cleanup
39
- def finished; end
39
+ def finished
40
+ RServiceBus2.rlog "#{self.class.name}. Default Finished"
41
+ end
40
42
 
41
43
  # At least called in the Host rescue block, to ensure all network links
42
44
  # are healthy
@@ -12,7 +12,7 @@ module RServiceBus2
12
12
  CGI.parse(u.query)['timeout1']&.first || 5
13
13
  end
14
14
 
15
- # rubocop:disable Metrics/MethodLength
15
+ # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
16
16
  def connect(uri)
17
17
  @uri = uri
18
18
  @timeout = deduce_timeout(uri)
@@ -36,7 +36,7 @@ module RServiceBus2
36
36
  puts e.message
37
37
  puts e.backtrace
38
38
  end
39
- # rubocop:enable Metrics/MethodLength
39
+ # rubocop:enable Metrics/MethodLength,Metrics/AbcSize
40
40
 
41
41
  def look
42
42
  job = @beanstalk.reserve @timeout
@@ -9,6 +9,7 @@ module RServiceBus2
9
9
 
10
10
  # rubocop:disable Metrics/ClassLength
11
11
  class MonitorDir < Monitor
12
+ # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
12
13
  def input_dir(uri)
13
14
  # Pass the path through the Dir object to check syntax on startup
14
15
  return Dir.new(uri.path) if File.writable?(uri.path)
@@ -27,44 +28,48 @@ module RServiceBus2
27
28
  "***** eg, rm #{uri.path} && mkdir #{uri.path}"
28
29
  abort
29
30
  end
31
+ # rubocop:enable Metrics/MethodLength,Metrics/AbcSize
30
32
 
31
- def connect(uri)
32
- @path = input_dir(uri).path
33
- @input_filter = []
34
-
35
- return if uri.query.nil?
33
+ def initialise_archive(parts)
34
+ return unless parts.key?('archive')
36
35
 
37
- parts = CGI.parse(uri.query)
38
- @querystringparts = parts
39
- if parts.key?('archive')
40
- archiveuri = URI.parse(parts['archive'][0])
41
- unless File.directory?(archiveuri.path)
42
- puts '***** Archive file name templating not yet supported.'
43
- puts "***** Directory's only."
44
- abort
45
- end
46
- @archivedir = archiveuri.path
36
+ archiveuri = URI.parse(parts['archive'][0])
37
+ unless File.directory?(archiveuri.path)
38
+ puts '***** Archive file name templating not yet supported.'
39
+ puts "***** Directory's only."
40
+ abort
47
41
  end
42
+ @archivedir = archiveuri.path
43
+ end
48
44
 
49
- return unless parts.key?('input_filter')
50
-
45
+ def initialise_input_filter(parts)
51
46
  if parts['input_filter'].count > 1
52
- puts 'Too many input_filters specified.'
53
- puts '*** ZIP, or GZ are the only valid input_filters.'
47
+ puts 'Too many input_filters specified.\n*** ZIP, or GZ are the only valid input_filters.'
54
48
  abort
55
49
  end
56
50
 
57
- if parts['input_filter'][0] == 'ZIP'
58
- elsif parts['input_filter'][0] == 'GZ'
59
- elsif parts['input_filter'][0] == 'TAR'
60
- else
61
- puts 'Invalid input_filter specified.'
62
- puts '*** ZIP, or GZ are the only valid input_filters.'
51
+ unless %w[ZIP GZ TAR].include?(parts['input_filter'][0]).nil?
52
+ puts 'Invalid input_filter specified.\n' \
53
+ '*** ZIP, or GZ are the only valid input_filters.'
63
54
  abort
64
55
  end
56
+
65
57
  @input_filter << parts['input_filter'][0]
66
58
  end
67
59
 
60
+ def connect(uri)
61
+ @path = input_dir(uri).path
62
+ @input_filter = []
63
+
64
+ return if uri.query.nil?
65
+
66
+ parts = CGI.parse(uri.query)
67
+ @querystringparts = parts
68
+ initialise_archive(parts)
69
+
70
+ initialise_input_filter(parts) if parts.key?('input_filter')
71
+ end
72
+
68
73
  def process_content(content)
69
74
  content
70
75
  end
@@ -86,13 +91,14 @@ module RServiceBus2
86
91
  # rubocop:disable Metrics/MethodLength
87
92
  def read_content_from_file(file_path)
88
93
  content = ''
89
- if @input_filter.length > 0
90
- if @input_filter[0] == 'ZIP'
94
+ if @input_filter.length.positive?
95
+ case @input_filter[0]
96
+ when 'ZIP'
91
97
  content = read_content_from_zip_file(file_path)
92
- elsif @input_filter[0] == 'GZ'
98
+ when 'GZ'
93
99
  content = read_content_from_gz_file(file_path)
94
- elsif @input_filter[0] == 'TAR'
95
- fail 'TAR reader not implemented'
100
+ else
101
+ raise "#{@input_filter[0]} reader not implemented."
96
102
  end
97
103
 
98
104
  else
@@ -101,13 +107,34 @@ module RServiceBus2
101
107
 
102
108
  content
103
109
  end
110
+ # rubocop:enable Metrics/MethodLength
111
+
112
+ def archive_file(file_path, content)
113
+ basename = File.basename(file_path)
114
+ new_file_path = "#{@archivedir}/#{basename}.#{Time.now.strftime('%Y%m%d%H%M%S%L')}.zip"
115
+ RServiceBus2.log "Writing to archive, #{new_file_path}"
116
+
117
+ Zip::ZipOutputStream.open(new_file_path) do |zos|
118
+ zos.put_next_entry(basename)
119
+ zos.puts content
120
+ end
121
+ end
104
122
 
105
123
  def process_path(file_path)
124
+ if File.file?(file_path) != true
125
+ RServiceBus2.log "Skipping directory, #{file_path}"
126
+ return
127
+ end
128
+
129
+ RServiceBus2.log "Ready to process, #{file_path}"
106
130
  content = read_content_from_file(file_path)
107
131
  payload = process_content(content)
108
132
 
109
- send(payload, URI.parse(URI.encode("file://#{file_path}")))
110
- content
133
+ send(payload, URI.parse(CGI.escape("file://#{file_path}")))
134
+
135
+ archive_file(file_path, content) unless @archivedir.nil?
136
+
137
+ File.unlink(file_path)
111
138
  end
112
139
 
113
140
  def look
@@ -116,28 +143,11 @@ module RServiceBus2
116
143
 
117
144
  file_list = Dir.glob("#{@path}/*")
118
145
  file_list.each do |file_path|
119
- if File.file?(file_path) != true
120
- RServiceBus2.log "Skipping directory, #{file_path}"
121
- next
122
- end
123
- RServiceBus2.log "Ready to process, #{file_path}"
124
- content = process_path(file_path)
125
-
126
- unless @archivedir.nil?
127
- basename = File.basename(file_path)
128
- new_file_path = "#{@archivedir}/#{basename}.#{Time.now.strftime('%Y%m%d%H%M%S%L')}.zip"
129
- RServiceBus2.log "Writing to archive, #{new_file_path}"
130
-
131
- Zip::ZipOutputStream.open(new_file_path) do |zos|
132
- zos.put_next_entry(basename)
133
- zos.puts content
134
- end
135
- end
136
- File.unlink(file_path)
146
+ process_path(file_path)
137
147
 
138
148
  file_processed += 1
139
- RServiceBus2.log "Processed #{file_processed} of #{file_list.length}."
140
- RServiceBus2.log "Allow system tick #{self.class.name}"
149
+ RServiceBus2.log "Processed #{file_processed} of #{file_list.length}.\nAllow system tick #{self.class.name}"
150
+
141
151
  break if file_processed >= max_files_processed
142
152
  end
143
153
  end
@@ -9,78 +9,70 @@ module RServiceBus2
9
9
  class MonitorDirNotifier < Monitor
10
10
  attr_reader :path, :processing_folder, :filter
11
11
 
12
- def connect(uri)
13
- # Pass the path through the Dir object to check syntax on startup
14
- begin
15
- open_folder uri.path
16
- unless File.writable?(uri.path)
17
- puts "***** Directory is not writable, #{uri.path}."
18
- puts "***** Make the directory, #{uri.path}, writable and try again."
19
- abort
20
- end
21
- rescue Errno::ENOENT
22
- puts "***** Directory does not exist, #{uri.path}."
23
- puts "***** Create the directory, #{uri.path}, and try again."
24
- puts "***** eg, mkdir #{uri.path}"
25
- abort
26
- rescue Errno::ENOTDIR
27
- puts "***** The specified path does not point to a directory,
28
- #{uri.path}."
29
- puts "***** Either repoint path to a directory, or remove, #{uri.path},
30
- and create it as a directory."
31
- puts "***** eg, rm #{uri.path} && mkdir #{uri.path}"
32
- abort
33
- end
12
+ def directory_not_writable(path, param_name)
13
+ "***** #{param_name} is not writable, #{path}.\n" \
14
+ "***** Make the directory, #{path}, writable and try again."
15
+ end
34
16
 
35
- @path = uri.path
17
+ def directory_does_not_exist(path, param_name)
18
+ "***** #{param_name} does not exist, #{path}.\n" \
19
+ "***** Create the directory, #{path}, and try again.\n" \
20
+ "***** eg, mkdir #{path}"
21
+ end
22
+
23
+ def path_is_not_a_directory(path)
24
+ "***** The specified path does not point to a directory, #{path}.\n" \
25
+ "***** Either repoint path to a directory, or remove, #{path}, and create it as a directory.\n" \
26
+ "***** eg, rm #{path} && mkdir #{path}"
27
+ end
28
+
29
+ def processing_directory_not_specified(path)
30
+ '***** Processing Directory is not specified.' \
31
+ '***** Specify the Processing Directory as a query string in the Path URI' \
32
+ "***** eg, '/#{path}?processing=*ProcessingDir*'"
33
+ end
36
34
 
35
+ def validate_directory(path, param_name)
36
+ open_folder path
37
+ return if File.writable?(path)
38
+
39
+ puts directory_not_writable(path, param_name)
40
+ abort
41
+ rescue Errno::ENOENT
42
+ puts directory_does_not_exist(path, param_name)
43
+ abort
44
+ rescue Errno::ENOTDIR
45
+ puts path_is_not_a_directory(path)
46
+ abort
47
+ end
48
+
49
+ def validate_processing_directory(uri)
37
50
  if uri.query.nil?
38
- puts '***** Processing Directory is not specified.'
39
- puts '***** Specify the Processing Directory as a query string in the
40
- Path URI'
41
- puts "***** eg, '/#{uri.path}?processing=*ProcessingDir*"
51
+ puts processing_directory_not_specified(uri.path)
42
52
  abort
43
- else
44
- parts = CGI.parse(uri.query)
45
-
46
- if parts.key? 'processing'
47
- processing_uri = URI.parse parts['processing'][0]
48
- begin
49
- open_folder processing_uri.path
50
- unless File.writable?(processing_uri.path)
51
- puts "***** 1Processing Directory is not writable,
52
- #{processing_uri.path}."
53
- puts "***** Make the directory, #{processing_uri.path},
54
- writable and try again."
55
- abort
56
- end
57
- rescue Errno::ENOENT
58
- puts "***** Processing Directory does not exist,
59
- #{processing_uri.path}."
60
- puts "***** Create the directory, #{processing_uri.path}, and try
61
- again."
62
- puts "***** eg, mkdir #{processing_uri.path}"
63
- abort
64
- rescue Errno::ENOTDIR
65
- puts "***** Processing Directory does not point to a directory,
66
- #{processing_uri.path}."
67
- puts "***** Either repoint path to a directory, or remove,
68
- #{processing_uri.path}, and create it as a directory."
69
- puts "***** eg, rm #{processing_uri.path} && mkdir
70
- #{processing_uri.path}"
71
- abort
72
- end
73
-
74
- @processing_folder = processing_uri.path
75
- end
76
-
77
- @filter = '*'
78
- @filter = parts['filter'][0] if parts.key? 'filter'
79
53
  end
54
+
55
+ parts = CGI.parse(uri.query)
56
+ return unless parts.key? 'processing'
57
+
58
+ processing_uri = URI.parse parts['processing'][0]
59
+ validate_directory processing_uri.path, 'Processing Directory'
60
+ @processing_folder = processing_uri.path
61
+ end
62
+
63
+ def connect(uri)
64
+ # Pass the path through the Dir object to check syntax on startup
65
+
66
+ validate_directory uri, 'Directory'
67
+ @path = uri.path
68
+ validate_processing_directory(uri)
69
+
70
+ @filter = '*'
71
+ @filter = parts['filter'][0] if parts.key? 'filter'
80
72
  end
81
73
 
82
74
  def look
83
- file_list = get_files
75
+ file_list = files
84
76
  file_list.each do |file_path|
85
77
  new_path = move_file(file_path, @processing_folder)
86
78
  send(nil, URI.parse("file://#{new_path}"))
@@ -97,8 +89,8 @@ module RServiceBus2
97
89
  Pathname.new(dest).join(filename)
98
90
  end
99
91
 
100
- def get_files
101
- Dir.glob(Pathname.new("#{@Path}").join(@Filter) ).select { |f| File.file?(f) }
92
+ def files
93
+ Dir.glob(Pathname.new(@path).join(@filter)).select { |f| File.file?(f) }
102
94
  end
103
95
  end
104
96
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'aws-sdk-sqs'
2
4
  require 'aws-sdk-sts'
3
5
  require 'rservicebus2/mq'
@@ -6,75 +8,59 @@ module RServiceBus2
6
8
  # Beanstalk client implementation.
7
9
  class MQAWS < MQ
8
10
  # Connect to the broker
9
- # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
10
- def connect(region, port)
11
- begin
12
- @max_job_size = 4_194_304
13
- @region = region
11
+ def connect(region, _port)
12
+ @max_job_size = 4_194_304
13
+ @region = region
14
14
 
15
- sts_client = Aws::STS::Client.new(region: region)
16
- @caller_identity_account = sts_client.get_caller_identity.account
17
- rescue StandardError => e
18
- puts 'Error connecting to AWS'
19
- puts "Host string, #{region}"
20
- puts e.message
21
- puts e.backtrace
22
- abort
23
- end
15
+ sts_client = Aws::STS::Client.new(region: region)
16
+ @caller_identity_account = sts_client.get_caller_identity.account
17
+ rescue StandardError => e
18
+ puts 'Error connecting to AWS'
19
+ puts "Host string, #{region}"
20
+ puts e.message
21
+ puts e.backtrace
22
+ abort
24
23
  end
25
24
 
26
25
  def subscribe(queuename)
27
26
  # For example:
28
27
  # 'https://sqs.us-east-1.amazonaws.com/111111111111/my-queue'
29
- @queue_url = 'https://sqs.' + @region + '.amazonaws.com/' +
30
- @caller_identity_account + '/' + queuename
28
+ @queue_url = "https://sqs.#{@region}.amazonaws.com/#{@caller_identity_account}/#{queuename}"
31
29
  @sqs_client = Aws::SQS::Client.new(region: @region)
32
30
  end
33
31
 
34
32
  # Get next msg from queue
35
33
  def pop
36
- begin
37
- response = @sqs_client.receive_message(
38
- queue_url: @queue_url,
39
- max_number_of_messages: 1
40
- )
34
+ response = @sqs_client.receive_message(queue_url: @queue_url, max_number_of_messages: 1)
41
35
 
42
- if response.messages.count.zero?
43
- raise NoMsgToProcess
44
- end
36
+ raise NoMsgToProcess if response.messages.count.zero?
45
37
 
46
- response.messages.each do |message|
47
- @job = message
48
- end
49
- rescue StandardError => e
50
- raise e
38
+ response.messages.each do |message|
39
+ @job = message
51
40
  end
41
+ rescue StandardError => e
42
+ raise e
43
+ ensure
52
44
  @job.body
53
45
  end
54
46
 
55
47
  def return_to_queue
56
- # @job.release if @job
57
48
  @job = nil
58
49
  end
59
50
 
60
51
  def ack
61
- @sqs_client.delete_message({
62
- queue_url: @queue_url,
63
- receipt_handle: @job.receipt_handle
64
- })
52
+ @sqs_client.delete_message({ queue_url: @queue_url, receipt_handle: @job.receipt_handle })
65
53
  @job = nil
66
54
  end
67
55
 
68
56
  def send(queue_name, msg)
69
57
  if msg.length > @max_job_size
70
- puts '***Attempting to send a msg which will not fit on queue.'
71
- puts "***Msg size, #{msg.length}, max msg size, #{@max_job_size}."
72
- fail JobTooBigError, "Msg size, #{msg.length}, max msg size,
73
- #{@max_job_size}"
58
+ puts '***Attempting to send a msg which will not fit on queue.' \
59
+ "***Msg size, #{msg.length}, max msg size, #{@max_job_size}."
60
+ raise JobTooBigError, "Msg size, #{msg.length}, max msg size, #{@max_job_size}"
74
61
  end
75
62
 
76
- queue_url = 'https://sqs.' + @region + '.amazonaws.com/' +
77
- @caller_identity_account + '/' + queue_name
63
+ queue_url = "https://sqs.#{@region}.amazonaws.com/#{@caller_identity_account}/#{queue_name}"
78
64
 
79
65
  @sqs_client.send_message(
80
66
  queue_url: queue_url,
@@ -16,19 +16,17 @@ module RServiceBus2
16
16
  @beanstalk = Beanstalk::Pool.new([string])
17
17
  @max_job_size = @beanstalk.stats['max-job-size']
18
18
  if @max_job_size < 4_194_304
19
- puts "***WARNING: Lowest recommended.max-job-size is 4m, current
20
- max-job-size, #{@max_job_size.to_f / (1024 * 1024)}m"
21
- puts '***WARNING: Set the job size with the -z switch, eg
22
- /usr/local/bin/beanstalkd -z 4194304'
19
+ puts '***WARNING: Lowest recommended.max-job-size is 4m, current ' \
20
+ "max-job-size, #{@max_job_size.to_f / (1024 * 1024)}m"
21
+ puts '***WARNING: Set the job size with the -z switch, eg ' \
22
+ '/usr/local/bin/beanstalkd -z 4194304'
23
23
  end
24
24
  rescue StandardError => e
25
25
  puts 'Error connecting to Beanstalk'
26
26
  puts "Host string, #{string}"
27
27
  if e.message == 'Beanstalk::NotConnected'
28
- puts '***Most likely, beanstalk is not running. Start beanstalk,
29
- and try running this again.'
30
- puts "***If you still get this error, check beanstalk is running
31
- at, #{string}"
28
+ puts '***Most likely, beanstalk is not running. Start beanstalk, and try running this again.'
29
+ puts "***If you still get this error, check beanstalk is running at, #{string}"
32
30
  else
33
31
  puts e.message
34
32
  puts e.backtrace
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'fileutils'
2
4
  require 'rservicebus2/mq'
3
5
 
@@ -5,18 +7,10 @@ module RServiceBus2
5
7
  # Beanstalk client implementation.
6
8
  class MQFile < MQ
7
9
  # Connect to the broker
8
- # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
9
-
10
+
10
11
  def initialize(uri)
11
- if uri.is_a? URI
12
- @uri = uri
13
- else
14
- puts 'uri must be a valid URI'
15
- abort
16
- end
12
+ super
17
13
 
18
- FileUtils.mkdir_p(@uri.path)
19
- @local_queue_name = RServiceBus2.get_value('APPNAME', 'RServiceBus')
20
14
  FileUtils.mkdir_p("#{@uri.path}/#{@local_queue_name}")
21
15
  @timeout = RServiceBus2.get_value('QUEUE_TIMEOUT', '5').to_i
22
16
  end
@@ -28,24 +22,23 @@ module RServiceBus2
28
22
  end
29
23
 
30
24
  # Get next msg from queue
25
+ # rubocop:disable Metrics/MethodLength
31
26
  def pop
32
27
  time = @timeout
33
- while time > 0
28
+ while time.positive?
34
29
  files = Dir.glob("#{@uri.path}/#{@local_queue_name}/*.msg")
35
- if files.length > 0
36
- @file_path = files[0]
30
+ if files.positive?
31
+ @file_path = files[0]
37
32
  @body = IO.read(@file_path)
38
- return @body
33
+ return @body
39
34
  end
40
- time -= 1
41
- sleep(1)
35
+ time -= 1
36
+ sleep(1)
42
37
  end
43
-
44
- raise NoMsgToProcess if files.length == 0
45
- end
46
38
 
47
- def return_to_queue
39
+ raise NoMsgToProcess if files.length.zero?
48
40
  end
41
+ # rubocop:enable Metrics/MethodLength
49
42
 
50
43
  def ack
51
44
  FileUtils.rm @file_path
@@ -53,7 +46,7 @@ module RServiceBus2
53
46
 
54
47
  def send(queue_name, msg)
55
48
  FileUtils.mkdir_p("#{@uri.path}/#{queue_name}")
56
- IO.write("#{@uri.path}/#{queue_name}/#{rand()}.msg", msg)
49
+ IO.write("#{@uri.path}/#{queue_name}/#{rand}.msg", msg)
57
50
  end
58
51
  end
59
52
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'redis'
2
4
  require 'rservicebus2/mq'
3
5
 
@@ -5,38 +7,31 @@ module RServiceBus2
5
7
  # Redis client implementation.
6
8
  class MQRedis < MQ
7
9
  # Connect to the broker
8
- # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
9
10
  def connect(host, port)
10
11
  port ||= 6379
11
12
  string = "#{host}:#{port}"
12
13
 
13
- begin
14
- @redis = Redis.new(:host => host, :port => port)
15
-
16
- rescue Exception => e
17
- puts e.message
18
- puts 'Error connecting to Redis for mq'
19
- puts "Host string, #{string}"
20
- abort()
21
- end
14
+ @redis = Redis.new(host: host, port: port)
15
+ rescue StandardError => e
16
+ puts e.message
17
+ puts 'Error connecting to Redis for mq'
18
+ puts "Host string, #{string}"
19
+ abort
22
20
  end
23
21
 
24
22
  # Connect to the queue
25
- def subscribe( queuename )
23
+ def subscribe(queuename)
26
24
  @queuename = queuename
27
25
  end
28
26
 
29
27
  # Get next msg from queue
30
28
  def pop
31
- if @redis.llen( @queuename ) == 0 then
29
+ if @redis.llen(@queuename).zero?
32
30
  sleep @timeout
33
- raise NoMsgToProcess.new
31
+ raise NoMsgToProcess
34
32
  end
35
33
 
36
- return @redis.lindex @queuename, 0
37
- end
38
-
39
- def returnToQueue
34
+ @redis.lindex @queuename, 0
40
35
  end
41
36
 
42
37
  # "Commit" queue
@@ -45,9 +40,8 @@ module RServiceBus2
45
40
  end
46
41
 
47
42
  # At least called in the Host rescue block, to ensure all network links are healthy
48
- def send( queueName, msg )
49
- @redis.rpush queueName, msg
43
+ def send(queue_name, msg)
44
+ @redis.rpush queue_name, msg
50
45
  end
51
-
52
46
  end
53
47
  end
@@ -81,7 +81,7 @@ module RServiceBus2
81
81
 
82
82
  return {} if content == ''
83
83
 
84
- YAML.load(content)
84
+ RServiceBus2.safe_load(content)
85
85
  end
86
86
  end
87
87
  end
@@ -16,7 +16,7 @@ module RServiceBus2
16
16
 
17
17
  return [] if content == ''
18
18
 
19
- YAML.load(content)
19
+ RServiceBus2.safe_load(content)
20
20
  end
21
21
 
22
22
  def add(msg)
@@ -61,7 +61,7 @@ module RServiceBus2
61
61
 
62
62
  return {} if content == ''
63
63
 
64
- YAML.load(content)
64
+ RServiceBus2.safe_load(content)
65
65
  end
66
66
  end
67
67
  end
@@ -7,11 +7,11 @@ module RServiceBus2
7
7
  RServiceBus2.log 'Load subscriptions'
8
8
  return {} unless File.exist?(@uri.path)
9
9
 
10
- YAML.load(File.open(@uri.path))
10
+ RServiceBus2.safe_load(File.open(@uri.path))
11
11
  end
12
12
 
13
13
  def add(event_name, queue_name)
14
- s = File.exist?(@uri.path) ? YAML.load(File.open(@uri.path)) : {}
14
+ s = File.exist?(@uri.path) ? RServiceBus2.safe_load(File.open(@uri.path)) : {}
15
15
  s[event_name] = [] if s[event_name].nil?
16
16
 
17
17
  s[event_name] << queue_name
@@ -114,7 +114,7 @@ module RServiceBus2
114
114
  def process
115
115
  # Get the next job from the source queue
116
116
  job = @source.reserve @timeout
117
- msg = YAML.load(job.body)
117
+ msg = RServiceBus2.safe_load(job.body)
118
118
 
119
119
  connect(msg.remote_host_name)
120
120
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rservicebus2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.14
4
+ version: 0.2.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Guy Irvine
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-14 00:00:00.000000000 Z
11
+ date: 2021-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: beanstalk-client