rservicebus2 0.2.10 → 0.2.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rservicebus2.rb +6 -4
  3. data/lib/rservicebus2/appresource/awss3.rb +3 -3
  4. data/lib/rservicebus2/appresource/awssqs.rb +2 -0
  5. data/lib/rservicebus2/appresource/dir.rb +3 -0
  6. data/lib/rservicebus2/appresource/file.rb +2 -0
  7. data/lib/rservicebus2/appresource/fluiddb.rb +3 -0
  8. data/lib/rservicebus2/appresource/fluiddb2.rb +3 -1
  9. data/lib/rservicebus2/config.rb +38 -29
  10. data/lib/rservicebus2/endpointmapping.rb +2 -4
  11. data/lib/rservicebus2/handler_manager.rb +1 -1
  12. data/lib/rservicebus2/helper_functions.rb +14 -13
  13. data/lib/rservicebus2/host.rb +1 -1
  14. data/lib/rservicebus2/message.rb +2 -0
  15. data/lib/rservicebus2/message/statisticoutput.rb +2 -0
  16. data/lib/rservicebus2/message/subscription.rb +2 -0
  17. data/lib/rservicebus2/message/verboseoutput.rb +2 -0
  18. data/lib/rservicebus2/monitor.rb +7 -7
  19. data/lib/rservicebus2/monitor/awss3.rb +3 -1
  20. data/lib/rservicebus2/monitor/awssqs.rb +9 -7
  21. data/lib/rservicebus2/monitor/dir.rb +24 -22
  22. data/lib/rservicebus2/monitor/dirnotifier.rb +3 -0
  23. data/lib/rservicebus2/monitor/message.rb +2 -0
  24. data/lib/rservicebus2/monitor/xmldir.rb +2 -0
  25. data/lib/rservicebus2/monitor_configure.rb +46 -36
  26. data/lib/rservicebus2/mq.rb +27 -30
  27. data/lib/rservicebus2/saga_loader.rb +27 -24
  28. data/lib/rservicebus2/saga_storage.rb +5 -4
  29. data/lib/rservicebus2/sendat_storage/file.rb +0 -1
  30. data/lib/rservicebus2/state_manager.rb +3 -3
  31. data/lib/rservicebus2/state_storage.rb +7 -6
  32. data/lib/rservicebus2/statistic_manager.rb +7 -3
  33. data/lib/rservicebus2/subscription_manager.rb +7 -5
  34. data/lib/rservicebus2/subscription_storage.rb +6 -5
  35. data/lib/rservicebus2/subscription_storage/file.rb +5 -18
  36. data/lib/rservicebus2/subscription_storage_configure.rb +2 -0
  37. data/lib/rservicebus2/transporter.rb +63 -52
  38. metadata +2 -3
  39. data/lib/rservicebus2/stats.rb +0 -68
@@ -6,7 +6,6 @@ module RServiceBus2
6
6
  def initialize(uri)
7
7
  RServiceBus2.log "SendAtStorageFile configured: #{uri.path}"
8
8
  @list = load(uri.path)
9
- puts "@list: #{@list.class.name}"
10
9
  @path = uri.path
11
10
  end
12
11
 
@@ -17,15 +17,15 @@ module RServiceBus2
17
17
  end
18
18
 
19
19
  def begin
20
- @state_storage.begin unless @state_storage.nil?
20
+ @state_storage&.begin
21
21
  end
22
22
 
23
23
  def get(handler)
24
- @state_storage.get(handler) unless @state_storage.nil?
24
+ @state_storage&.get(handler)
25
25
  end
26
26
 
27
27
  def commit
28
- @state_storage.commit unless @state_storage.nil?
28
+ @state_storage&.commit
29
29
  end
30
30
  end
31
31
  end
@@ -1,17 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RServiceBus2
2
4
  # State Storage
3
5
  class StateStorage
4
6
  def self.get(uri)
5
7
  case uri.scheme
6
8
  when 'dir'
7
- require 'rservicebus2/state_storage/dir.rb'
8
- return StateStorageDir.new(uri)
9
+ require 'rservicebus2/state_storage/dir'
10
+ StateStorageDir.new(uri)
9
11
  when 'inmem'
10
- require 'rservicebus2/state_storage/inmemory.rb'
11
- return StateStorageInMemory.new(uri)
12
+ require 'rservicebus2/state_storage/inmemory'
13
+ StateStorageInMemory.new(uri)
12
14
  else
13
- abort("Scheme, #{uri.scheme}, not recognised when configuring
14
- StateStorage, #{uri}")
15
+ abort("Scheme, #{uri.scheme}, not recognised when configuring StateStorage, #{uri}")
15
16
  end
16
17
  end
17
18
  end
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RServiceBus2
2
4
  # Used to collect various run time stats for runtime reporting
3
5
  class StatisticManager
4
6
  attr_accessor :output
5
7
 
8
+ # rubocop:disable Metrics/MethodLength
6
9
  def initialize(host)
7
10
  @host = host
8
11
  @hash = {}
@@ -20,6 +23,7 @@ module RServiceBus2
20
23
  RServiceBus2.get_value('STAT_OUTPUT_COUNTDOWN', '1').to_i
21
24
  @stat_output_countdown = 0
22
25
  end
26
+ # rubocop:enable Metrics/MethodLength
23
27
 
24
28
  def inc_total_processed
25
29
  @total_processed += 1
@@ -51,7 +55,7 @@ module RServiceBus2
51
55
  @total_by_message_type[class_name] += 1
52
56
  end
53
57
 
54
- def get_for_reporting_2
58
+ def internal_formatted_reporting
55
59
  return unless @written == false
56
60
 
57
61
  @written = true
@@ -63,7 +67,7 @@ module RServiceBus2
63
67
  types
64
68
  end
65
69
 
66
- def get_for_reporting_9
70
+ def formatted_reporting
67
71
  "T:#{@total_processed};" \
68
72
  "E:#{@total_errored};" \
69
73
  "S:#{@total_sent};" \
@@ -72,7 +76,7 @@ module RServiceBus2
72
76
  end
73
77
 
74
78
  def report
75
- @host.log(get_for_reporting_9) if @output
79
+ @host.log(formatted_reporting) if @output
76
80
  end
77
81
 
78
82
  def tick
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RServiceBus2
2
4
  # Subscription Manager
3
5
  class SubscriptionManager
4
6
  def initialize(subscription_storage)
5
7
  @subscription_storage = subscription_storage
6
- @subscriptions = @subscription_storage.get_all
8
+ @subscriptions = @subscription_storage.all
7
9
  end
8
10
 
9
11
  # Get subscriptions for given eventName
@@ -11,7 +13,8 @@ module RServiceBus2
11
13
  subscriptions = @subscriptions[event_name]
12
14
  if subscriptions.nil?
13
15
  RServiceBus2.log "No subscribers for event, #{event_name}"
14
- RServiceBus2.log "If there should be, ensure you have the appropriate evironment variable set, eg MESSAGE_ENDPOINT_MAPPINGS=#{event_name}:<Queue Name>"
16
+ RServiceBus2.log 'If there should be, ensure you have the appropriate evironment variable set, ' \
17
+ "eg MESSAGE_ENDPOINT_MAPPINGS=#{event_name}:<Queue Name>"
15
18
  return []
16
19
  end
17
20
 
@@ -19,13 +22,12 @@ module RServiceBus2
19
22
  end
20
23
 
21
24
  def add(event_name, queue_name)
22
- RServiceBus2.log 'Adding subscription for, ' +
23
- event_name + ', to, ' + queue_name
25
+ RServiceBus2.log "Adding subscription for, #{event_name}, to, #{queue_name}"
24
26
  @subscriptions = @subscription_storage.add(event_name, queue_name)
25
27
  end
26
28
 
27
29
  def remove(_event_name, _queue_name)
28
- fail 'Method, remove, needs to be implemented for this subscription storage'
30
+ raise 'Method, remove, needs to be implemented for this subscription storage'
29
31
  end
30
32
  end
31
33
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'uri'
2
4
 
3
5
  module RServiceBus2
@@ -14,8 +16,8 @@ module RServiceBus2
14
16
  end
15
17
 
16
18
  # Get a list of all subscription, as an Array
17
- def get_all
18
- fail 'Method, get_all, needs to be implemented for SubscriptionStorage'
19
+ def all
20
+ raise 'Method, all, needs to be implemented for SubscriptionStorage'
19
21
  end
20
22
 
21
23
  # Add a new subscription
@@ -23,7 +25,7 @@ module RServiceBus2
23
25
  # has asked for notification
24
26
  # @param [String] queue_name the queue to which the event should be sent
25
27
  def add(_event_name, _queue_name)
26
- fail 'Method, add, needs to be implemented for this subscription storage'
28
+ raise 'Method, add, needs to be implemented for this subscription storage'
27
29
  end
28
30
 
29
31
  # Remove an existing subscription
@@ -32,8 +34,7 @@ module RServiceBus2
32
34
  # has asked for notification
33
35
  # @param [String] queue_name the queue to which the event should be sent
34
36
  def remove(_event_name, _queue_name)
35
- fail 'Method, remove, needs to be implemented for this subscription
36
- storage'
37
+ raise 'Method, remove, needs to be implemented for this subscription storage'
37
38
  end
38
39
  end
39
40
  end
@@ -1,15 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RServiceBus2
2
4
  # Implementation of Subscription Storage to Redis
3
5
  class SubscriptionStorageFile < SubscriptionStorage
4
- # Constructor
5
- #
6
- # @param [String] app_ame Name of the application, used as a Namespace
7
- # @param [String] uri resource location to attach, eg redis://127.0.0.1/foo
8
- def initialize(app_name, uri)
9
- super(app_name, uri)
10
- end
11
-
12
- def get_all
6
+ def all
13
7
  RServiceBus2.log 'Load subscriptions'
14
8
  return {} unless File.exist?(@uri.path)
15
9
 
@@ -17,13 +11,7 @@ module RServiceBus2
17
11
  end
18
12
 
19
13
  def add(event_name, queue_name)
20
- # s => subscriptions
21
- if File.exist?(@uri.path)
22
- s = YAML.load(File.open(@uri.path))
23
- else
24
- s = {}
25
- end
26
-
14
+ s = File.exist?(@uri.path) ? YAML.load(File.open(@uri.path)) : {}
27
15
  s[event_name] = [] if s[event_name].nil?
28
16
 
29
17
  s[event_name] << queue_name
@@ -35,8 +23,7 @@ module RServiceBus2
35
23
  end
36
24
 
37
25
  def remove(_event_name, _queue_name)
38
- fail 'Method, remove, needs to be implemented for this
39
- subscription storage'
26
+ raise 'Method, remove, needs to be implemented for this subscription storage'
40
27
  end
41
28
  end
42
29
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'uri'
2
4
  module RServiceBus2
3
5
  # Configure SubscriptionStorage for an rservicebus host
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'beanstalk-client'
2
4
  require 'rservicebus2'
3
5
  require 'net/ssh/gateway'
@@ -8,13 +10,15 @@ module RServiceBus2
8
10
 
9
11
  # TODO: Poison Message? Can I bury with timeout in beanstalk ?
10
12
  # Needs to end up on an error queue, destination queue may be down.
13
+ # rubocop:disable Metrics/ClassLength
11
14
  class Transporter
12
15
  def get_value(name, default = nil)
13
- value = (ENV[name].nil? || ENV[name] == '') ? default : ENV[name]
16
+ value = ENV[name].nil? || ENV[name] == '' ? default : ENV[name]
14
17
  RServiceBus2.log "Env value: #{name}: #{value}"
15
18
  value
16
19
  end
17
20
 
21
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
18
22
  def connect_to_source_beanstalk
19
23
  source_queue_name = get_value('SOURCE_QUEUE_NAME', 'transport-out')
20
24
  source_url = get_value('SOURCE_URL', '127.0.0.1:11300')
@@ -22,7 +26,6 @@ module RServiceBus2
22
26
  @source.watch source_queue_name
23
27
 
24
28
  RServiceBus2.log "Connected to, #{source_queue_name}@#{source_url}"
25
-
26
29
  rescue StandardError => e
27
30
  puts 'Error connecting to Beanstalk'
28
31
  puts "Host string, #{sourceUrl}"
@@ -35,71 +38,79 @@ module RServiceBus2
35
38
  end
36
39
  abort
37
40
  end
41
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
38
42
 
39
43
  def disconnect
40
44
  RServiceBus2.log "Disconnect from,
41
45
  #{@remote_user_name}@#{@remote_host_name}/#{@remote_queue_name}"
42
- @gateway.shutdown! unless @gateway.nil?
46
+ @gateway&.shutdown!
43
47
  @gateway = nil
44
48
  @remote_host_name = nil
45
49
 
46
- @destination.close unless @destination.nil?
50
+ @destination&.close
47
51
  @destination = nil
48
52
 
49
53
  @remote_user_name = nil
50
54
  @remote_queue_name = nil
51
55
  end
52
56
 
57
+ # rubocop:disable Metrics/MethodLength
58
+ def connect_local
59
+ @local_port = get_value('LOCAL_PORT', 27_018).to_i
60
+ RServiceBus2.rlog "Local Port: #{@local_port}"
61
+
62
+ RServiceBus2.log "Connect SSH, #{@remote_user_name}@#{@remoteHostName}"
63
+ # Open port 27018 to forward to 127.0.0.11300 on the remote host
64
+ @gateway = Net::SSH::Gateway.new(@remote_host_name, @remote_user_name)
65
+ @gateway.open('127.0.0.1', 11_300, @local_port)
66
+ RServiceBus2.log "Connected to SSH, #{@remote_user_name}@#{@remote_host_name}"
67
+ rescue Errno::EADDRINUSE
68
+ puts "*** Local transport port in use, #{@local_port}"
69
+ puts "*** Change local transport port, #{@localPort}, using format, LOCAL_PORT=#{@localPort + 1}"
70
+ abort
71
+ rescue Errno::EACCES
72
+ puts "*** Local transport port specified, #{@local_port}, needs sudo access"
73
+ puts '*** Change local transport port using format, LOCAL_PORT=27018'
74
+ abort
75
+ end
76
+ # rubocop:enable Metrics/MethodLength
77
+
78
+ def connect_destination
79
+ destination_url = "127.0.0.1:#{@local_port}"
80
+ RServiceBus2.rlog "Connect to Remote Beanstalk, #{destination_url}"
81
+ @destination = Beanstalk::Pool.new([destinationUrl])
82
+ RServiceBus2.rlog "Connected to Remote Beanstalk, #{destination_url}"
83
+ rescue StandardError => e
84
+ if e.message == 'Beanstalk::NotConnected'
85
+ puts "***Could not connect to destination, check beanstalk is running at, #{destination_url}"
86
+ raise CouldNotConnectToDestination
87
+ end
88
+ raise
89
+ end
90
+
91
+ def pull_config(remote_host_name)
92
+ @remote_host_name = remote_host_name
93
+ @remote_user_name = get_value("REMOTE_USER_#{remote_host_name.upcase}")
94
+ return unless @remote_user_name.nil?
95
+
96
+ RServiceBus2.log "**** Username not specified for Host, #{remoteHostName}"
97
+ RServiceBus2.log "**** Add an environment variable of the form, REMOTE_USER_#{remoteHostName.upcase}=[USERNAME]"
98
+ abort
99
+ end
100
+
53
101
  def connect(remote_host_name)
54
102
  RServiceBus2.rlog "connect called, #{remote_host_name}"
55
- if @gateway.nil? || remoteHostName != @remote_host_name || @destination.nil?
56
- disconnect
57
- end
103
+ disconnect if @gateway.nil? || remoteHostName != @remote_host_name || @destination.nil?
58
104
 
59
- if @gateway.nil?
60
- # Get destination url from job
61
- @remote_host_name = remote_host_name
62
- @remote_user_name = get_value("REMOTE_USER_#{remote_host_name.upcase}")
63
- if @remote_user_name.nil?
64
- RServiceBus2.log "**** Username not specified for Host, #{remoteHostName}"
65
- RServiceBus2.log "**** Add an environment variable of the form, REMOTE_USER_#{remoteHostName.upcase}=[USERNAME]"
66
- abort
67
- end
68
-
69
- @local_port = get_value('LOCAL_PORT', 27018).to_i
70
- RServiceBus2.rlog "Local Port: #{@local_port}"
71
- begin
72
- RServiceBus2.log "Connect SSH, #{@remote_user_name}@#{@remoteHostName}"
73
- # Open port 27018 to forward to 127.0.0.11300 on the remote host
74
- @gateway = Net::SSH::Gateway.new(@remote_host_name, @remote_user_name)
75
- @gateway.open('127.0.0.1', 11300, @local_port)
76
- RServiceBus2.log "Connected to SSH, #{@remote_user_name}@#{@remote_host_name}"
77
-
78
- rescue Errno::EADDRINUSE
79
- puts "*** Local transport port in use, #{@local_port}"
80
- puts "*** Change local transport port, #{@localPort}, using format, LOCAL_PORT=#{@localPort+1}"
81
- abort
82
- rescue Errno::EACCES
83
- puts "*** Local transport port specified, #{@local_port}, needs sudo access"
84
- puts '*** Change local transport port using format, LOCAL_PORT=27018'
85
- abort
86
- end
87
-
88
- begin
89
- destination_url = "127.0.0.1:#{@local_port}"
90
- RServiceBus2.rlog "Connect to Remote Beanstalk, #{destination_url}"
91
- @destination = Beanstalk::Pool.new([destinationUrl])
92
- RServiceBus2.rlog "Connected to Remote Beanstalk, #{destination_url}"
93
- rescue StandardError => e
94
- if e.message == 'Beanstalk::NotConnected'
95
- puts "***Could not connect to destination, check beanstalk is running at, #{destination_url}"
96
- raise CouldNotConnectToDestination
97
- end
98
- raise
99
- end
100
- end
105
+ return unless @gateway.nil?
106
+
107
+ # Get destination url from job
108
+ pull_config(remote_host_name)
109
+ connect_local
110
+ connect_destination
101
111
  end
102
112
 
113
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
103
114
  def process
104
115
  # Get the next job from the source queue
105
116
  job = @source.reserve @timeout
@@ -129,14 +140,14 @@ module RServiceBus2
129
140
  end
130
141
  raise e
131
142
  end
143
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
132
144
 
133
145
  def run
134
146
  @timeout = get_value('TIMEOUT', 5)
135
147
  connectToSourceBeanstalk
136
- while true
137
- process
138
- end
148
+ loop { process }
139
149
  disconnect_from_remote_ssh
140
150
  end
141
151
  end
152
+ # rubocop:enable Metrics/ClassLength
142
153
  end
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.10
4
+ version: 0.2.11
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-11 00:00:00.000000000 Z
11
+ date: 2021-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: beanstalk-client
@@ -156,7 +156,6 @@ files:
156
156
  - lib/rservicebus2/state_storage/dir.rb
157
157
  - lib/rservicebus2/state_storage/inmemory.rb
158
158
  - lib/rservicebus2/statistic_manager.rb
159
- - lib/rservicebus2/stats.rb
160
159
  - lib/rservicebus2/subscription_manager.rb
161
160
  - lib/rservicebus2/subscription_storage.rb
162
161
  - lib/rservicebus2/subscription_storage/file.rb
@@ -1,68 +0,0 @@
1
- module RServiceBus2
2
- # Used to collect various run time stats for runtime reporting
3
- class Stats
4
- def initialize
5
- @hash = {}
6
-
7
- @total_processed = 0
8
- @total_errored = 0
9
- @total_sent = 0
10
- @total_published = 0
11
- @total_reply = 0
12
-
13
- @total_by_message_type = {}
14
-
15
- @written = false
16
- end
17
-
18
- def inc_total_processed
19
- @total_processed += 1
20
- end
21
-
22
- def inc_total_errored
23
- @total_errored += 1
24
- end
25
-
26
- def inc_total_sent
27
- @total_sent += 1
28
- end
29
-
30
- def inc_total_published
31
- @total_published += 1
32
- end
33
-
34
- def inc_total_reply
35
- @total_reply += 1
36
- end
37
-
38
- def inc(key)
39
- @hash[key] = 0 if @hash[key].nil?
40
- @hash[key] += 1
41
- end
42
-
43
- def inc_message_type(class_name)
44
- @total_by_message_type[class_name] = 0 if @total_by_message_type[class_name].nil?
45
- @total_by_message_type[class_name] += 1
46
- end
47
- end
48
-
49
- def get_for_reporting_2
50
- return unless @written == false
51
-
52
- @written = true
53
- types = Hash.new(0)
54
- ObjectSpace.each_object do |obj|
55
- types[obj.class] += 1
56
- end
57
-
58
- types
59
- end
60
-
61
- def get_for_reporting
62
- "T:#{@total_processed};
63
- E:#{@total_errored};
64
- S:#{@total_sent};
65
- P:#{@total_published};
66
- R:#{@total_reply}"
67
- end
68
- end