rservicebus2 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +64 -0
- data/bin/return_messages_to_source_queue +114 -0
- data/bin/rsb_ctl +38 -0
- data/bin/rservicebus2 +14 -0
- data/bin/rservicebus2-create +107 -0
- data/bin/rservicebus2-init +104 -0
- data/bin/rservicebus2-transport +16 -0
- data/bin/send_empty_message +15 -0
- data/lib/rservicebus.rb +59 -0
- data/lib/rservicebus/agent.rb +54 -0
- data/lib/rservicebus/appresource.rb +65 -0
- data/lib/rservicebus/appresource/dir.rb +29 -0
- data/lib/rservicebus/appresource/file.rb +8 -0
- data/lib/rservicebus/appresource/fluiddb.rb +24 -0
- data/lib/rservicebus/appresource_configure.rb +33 -0
- data/lib/rservicebus/audit.rb +28 -0
- data/lib/rservicebus/circuitbreaker.rb +79 -0
- data/lib/rservicebus/config.rb +168 -0
- data/lib/rservicebus/cron_manager.rb +76 -0
- data/lib/rservicebus/endpointmapping.rb +72 -0
- data/lib/rservicebus/errormessage.rb +14 -0
- data/lib/rservicebus/handler_loader.rb +162 -0
- data/lib/rservicebus/handler_manager.rb +131 -0
- data/lib/rservicebus/helper_functions.rb +85 -0
- data/lib/rservicebus/host.rb +487 -0
- data/lib/rservicebus/message.rb +78 -0
- data/lib/rservicebus/message/statisticoutput.rb +7 -0
- data/lib/rservicebus/message/subscription.rb +10 -0
- data/lib/rservicebus/message/verboseoutput.rb +7 -0
- data/lib/rservicebus/monitor.rb +61 -0
- data/lib/rservicebus/monitor/csvdir.rb +52 -0
- data/lib/rservicebus/monitor/dir.rb +139 -0
- data/lib/rservicebus/monitor/dirnotifier.rb +101 -0
- data/lib/rservicebus/monitor/message.rb +11 -0
- data/lib/rservicebus/monitor/xmldir.rb +11 -0
- data/lib/rservicebus/monitor_configure.rb +71 -0
- data/lib/rservicebus/mq.rb +98 -0
- data/lib/rservicebus/mq/beanstalk.rb +72 -0
- data/lib/rservicebus/resource_manager.rb +69 -0
- data/lib/rservicebus/saga/base.rb +17 -0
- data/lib/rservicebus/saga/data.rb +20 -0
- data/lib/rservicebus/saga/manager.rb +128 -0
- data/lib/rservicebus/saga_loader.rb +118 -0
- data/lib/rservicebus/saga_storage.rb +18 -0
- data/lib/rservicebus/saga_storage/dir.rb +87 -0
- data/lib/rservicebus/saga_storage/inmemory.rb +37 -0
- data/lib/rservicebus/sendat_manager.rb +33 -0
- data/lib/rservicebus/sendat_storage.rb +20 -0
- data/lib/rservicebus/sendat_storage/file.rb +37 -0
- data/lib/rservicebus/sendat_storage/inmemory.rb +20 -0
- data/lib/rservicebus/state_manager.rb +30 -0
- data/lib/rservicebus/state_storage.rb +18 -0
- data/lib/rservicebus/state_storage/dir.rb +66 -0
- data/lib/rservicebus/state_storage/inmemory.rb +25 -0
- data/lib/rservicebus/statistic_manager.rb +86 -0
- data/lib/rservicebus/stats.rb +68 -0
- data/lib/rservicebus/subscription_manager.rb +31 -0
- data/lib/rservicebus/subscription_storage.rb +39 -0
- data/lib/rservicebus/subscription_storage/file.rb +42 -0
- data/lib/rservicebus/subscription_storage/redis.rb +69 -0
- data/lib/rservicebus/subscription_storage_configure.rb +19 -0
- data/lib/rservicebus/test.rb +2 -0
- data/lib/rservicebus/test/bus.rb +32 -0
- data/lib/rservicebus/transporter.rb +142 -0
- data/lib/rservicebus/usermessage/withpayload.rb +10 -0
- metadata +184 -0
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'parse-cron'
|
2
|
+
|
3
|
+
module RServiceBus
|
4
|
+
# Globber
|
5
|
+
class Globber
|
6
|
+
def self.parse_to_regex(str)
|
7
|
+
escaped = Regexp.escape(str).gsub('\*', '.*?')
|
8
|
+
Regexp.new "^#{escaped}$", Regexp::IGNORECASE
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(str)
|
12
|
+
@regex = self.class.parse_to_regex str
|
13
|
+
end
|
14
|
+
|
15
|
+
def =~(str)
|
16
|
+
!!(str =~ @regex)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class NoMatchingMsgForCron < StandardError
|
21
|
+
end
|
22
|
+
|
23
|
+
# Cron Manager
|
24
|
+
class CronManager
|
25
|
+
def get_matching_msg_names(name)
|
26
|
+
list = []
|
27
|
+
@msg_names.each do |n|
|
28
|
+
list << n if Globber.new(name) =~ n
|
29
|
+
end
|
30
|
+
fail NoMatchingMsgForCron, name if list.length == 0
|
31
|
+
list
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_cron(name, cron_string)
|
35
|
+
get_matching_msg_names(name).each do |n|
|
36
|
+
hash = {}
|
37
|
+
hash['name'] = n
|
38
|
+
hash['last'] = Time.now
|
39
|
+
hash['v'] = cron_string
|
40
|
+
hash['cron'] = CronParser.new(cron_string)
|
41
|
+
hash['next'] = hash['cron'].next(Time.now)
|
42
|
+
@list << hash
|
43
|
+
@bus.log("Cron set for, #{n}, #{cron_string}, next run, #{hash['next']}")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def initialize(host, msg_names = [])
|
48
|
+
@bus = host
|
49
|
+
@msg_names = msg_names
|
50
|
+
|
51
|
+
RServiceBus.rlog 'Load Cron'
|
52
|
+
@list = []
|
53
|
+
ENV.each do |k, vs|
|
54
|
+
if k.start_with?('RSBCRON_')
|
55
|
+
add_cron(k.sub('RSBCRON_', ''), vs)
|
56
|
+
elsif k.start_with?('RSBCRON')
|
57
|
+
vs.split(';').each do |v|
|
58
|
+
parts = v.split(' ', 6)
|
59
|
+
add_cron(parts.pop, parts.join(' '))
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def run
|
66
|
+
now = Time.now
|
67
|
+
@list.each_with_index do |v, idx|
|
68
|
+
next if now <= v['next']
|
69
|
+
|
70
|
+
RServiceBus.rlog "CronManager.Send, #{v['name']}"
|
71
|
+
@bus.send(RServiceBus.create_anonymous_class(v['name']))
|
72
|
+
@list[idx]['next'] = v['cron'].next(now)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module RServiceBus
|
2
|
+
# Marshals data for message end points
|
3
|
+
# Expected format: <msg mame 1>:<end point 1>;<msg mame 2>:<end point 2>
|
4
|
+
class EndpointMapping
|
5
|
+
def get_value(name)
|
6
|
+
RServiceBus.get_value(name)
|
7
|
+
end
|
8
|
+
|
9
|
+
def log(string, _ver = false)
|
10
|
+
RServiceBus.log(string)
|
11
|
+
end
|
12
|
+
|
13
|
+
def configure_mapping(mapping)
|
14
|
+
match = mapping.match(/(.+):(.+)/)
|
15
|
+
if match.nil?
|
16
|
+
log 'Mapping string provided is invalid'
|
17
|
+
log "The entire mapping string is: #{mapping}"
|
18
|
+
log "*** Could not find ':' in mapping entry, #{line}"
|
19
|
+
exit
|
20
|
+
end
|
21
|
+
|
22
|
+
RServiceBus.rlog "EndpointMapping.configureMapping: #{match[1]}, #{match[2]}"
|
23
|
+
@endpoints[match[1]] = match[2]
|
24
|
+
|
25
|
+
@queue_name_list.each do |q|
|
26
|
+
if q != match[2] && q.downcase == match[2].downcase
|
27
|
+
log('*** Two queues specified with only case sensitive difference.')
|
28
|
+
log("*** #{q} != #{match[2]}")
|
29
|
+
log('*** If you meant these queues to be the same, please match case
|
30
|
+
and restart the bus.')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
@queue_name_list << match[2]
|
34
|
+
end
|
35
|
+
|
36
|
+
def configure(local_queue_name=nil)
|
37
|
+
log('EndpointMapping.Configure')
|
38
|
+
|
39
|
+
@queue_name_list = []
|
40
|
+
@queue_name_list << local_queue_name unless local_queue_name.nil?
|
41
|
+
|
42
|
+
unless get_value('MESSAGE_ENDPOINT_MAPPING').nil?
|
43
|
+
log('*** MESSAGE_ENDPOINT_MAPPING environment variable was detected')
|
44
|
+
log("*** You may have intended MESSAGE_ENDPOINT_MAPPINGS, note the 'S'
|
45
|
+
on the end")
|
46
|
+
end
|
47
|
+
|
48
|
+
mappings = get_value('MESSAGE_ENDPOINT_MAPPINGS')
|
49
|
+
return self if mappings.nil?
|
50
|
+
|
51
|
+
mappings.split(';').each do |mapping|
|
52
|
+
configure_mapping(mapping)
|
53
|
+
end
|
54
|
+
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
def initialize
|
59
|
+
@endpoints = {}
|
60
|
+
end
|
61
|
+
|
62
|
+
def get(msg_name)
|
63
|
+
return @endpoints[msg_name] if @endpoints.key?(msg_name)
|
64
|
+
|
65
|
+
nil
|
66
|
+
end
|
67
|
+
|
68
|
+
def get_subscription_endpoints
|
69
|
+
@endpoints.keys.select { |el| el.end_with?('Event') }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module RServiceBus
|
2
|
+
|
3
|
+
# Error Message
|
4
|
+
class ErrorMessage
|
5
|
+
attr_reader :occurredat, :source_queue, :error_msg
|
6
|
+
|
7
|
+
def initialize(source_queue, error_msg)
|
8
|
+
@occurredat = DateTime.now
|
9
|
+
|
10
|
+
@source_queue = source_queue
|
11
|
+
@error_msg = error_msg
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
module RServiceBus
|
2
|
+
# Given a directory, this class is responsible for finding
|
3
|
+
# msgnames,
|
4
|
+
# handlernames, and
|
5
|
+
# loading handlers
|
6
|
+
class HandlerLoader
|
7
|
+
attr_reader :handlerList
|
8
|
+
|
9
|
+
# Constructor
|
10
|
+
#
|
11
|
+
# @param [RServiceBus::Host] host instance
|
12
|
+
# @param [Hash] appResources As hash[k,v] where k is the name of a
|
13
|
+
# resource, and v is the resource
|
14
|
+
def initialize(host, handler_manager)
|
15
|
+
@host = host
|
16
|
+
|
17
|
+
@handler_manager = handler_manager
|
18
|
+
|
19
|
+
@list_of_loaded_paths = {}
|
20
|
+
end
|
21
|
+
|
22
|
+
# Cleans the given path to ensure it can be used for as a parameter for the require statement.
|
23
|
+
# @param [String] file_path the path to be cleaned
|
24
|
+
def get_require_path(file_path)
|
25
|
+
file_path = './' + file_path unless file_path.start_with?('/')
|
26
|
+
|
27
|
+
return file_path.sub('.rb', '') if File.exist?(file_path)
|
28
|
+
|
29
|
+
abort('Filepath, ' + file_path + ", given for MessageHandler require
|
30
|
+
doesn't exist")
|
31
|
+
end
|
32
|
+
|
33
|
+
# Instantiate the handler named in handlerName from the file name in
|
34
|
+
# file_path. Exceptions will be raised if encountered when loading handlers.
|
35
|
+
# This is a load time activity, so handlers should load correctly. As much
|
36
|
+
# information as possible is returned to enable the handler to be fixed,
|
37
|
+
# or configuration corrected.
|
38
|
+
# @param [String] handler_name name of the handler to instantiate
|
39
|
+
# @param [String] file_path the path to the file to be loaded
|
40
|
+
# @return [RServiceBus::Handler] the loader
|
41
|
+
def load_handler_from_file(handler_name, file_path)
|
42
|
+
require_path = get_require_path(file_path)
|
43
|
+
|
44
|
+
require require_path
|
45
|
+
begin
|
46
|
+
handler = Object.const_get(handler_name).new
|
47
|
+
rescue StandardError => e
|
48
|
+
puts 'Expected class name: ' + handler_name + ', not found after
|
49
|
+
require: ' + require_path
|
50
|
+
puts '**** Check in ' + file_path + ' that the class is named : ' +
|
51
|
+
handler_name
|
52
|
+
puts '( In case its not that )'
|
53
|
+
raise e
|
54
|
+
end
|
55
|
+
|
56
|
+
handler
|
57
|
+
end
|
58
|
+
|
59
|
+
# Wrapper function
|
60
|
+
#
|
61
|
+
# @param [String] file_path
|
62
|
+
# @param [String] handler_name
|
63
|
+
# @returns [RServiceBus::Handler] handler
|
64
|
+
def load_handler(msg_name, file_path, handler_name)
|
65
|
+
if @list_of_loaded_paths.key?(file_path)
|
66
|
+
RServiceBus.log "Not reloading, #{file_path}"
|
67
|
+
return
|
68
|
+
end
|
69
|
+
|
70
|
+
begin
|
71
|
+
RServiceBus.rlog 'file_path: ' + file_path
|
72
|
+
RServiceBus.rlog 'handler_name: ' + handler_name
|
73
|
+
|
74
|
+
handler = load_handler_from_file(handler_name, file_path)
|
75
|
+
RServiceBus.log 'Loaded Handler: ' + handler_name
|
76
|
+
|
77
|
+
@handler_manager.add_handler(msg_name, handler)
|
78
|
+
|
79
|
+
@list_of_loaded_paths[file_path] = 1
|
80
|
+
rescue StandardError => e
|
81
|
+
puts 'Exception loading handler from file: ' + file_path
|
82
|
+
puts e.message
|
83
|
+
puts e.backtrace[0]
|
84
|
+
abort
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# This method is overloaded for unit tests
|
89
|
+
#
|
90
|
+
# @param [String] path directory to check
|
91
|
+
# @return [Array] a list of paths to files found in the given path
|
92
|
+
def get_list_of_files_for_dir(path)
|
93
|
+
list = Dir[path + '/*']
|
94
|
+
RServiceBus.rlog "HandlerLoader.getListOfFilesForDir. path: #{path},
|
95
|
+
list: #{list}"
|
96
|
+
list
|
97
|
+
end
|
98
|
+
|
99
|
+
# Multiple handlers for the same msg can be placed inside a top level
|
100
|
+
# directory. The msg name is than taken from the directory, and the
|
101
|
+
# handlers from the files inside that directory
|
102
|
+
#
|
103
|
+
# @param [String] msg_name name of message
|
104
|
+
# @param [String] base_dir directory to check for handlers of [msg_name]
|
105
|
+
def load_handlers_from_second_level_path(msg_name, base_dir)
|
106
|
+
get_list_of_files_for_dir(base_dir).each do |file_path|
|
107
|
+
next if file_path.end_with?('.')
|
108
|
+
|
109
|
+
ext_name = File.extname(file_path)
|
110
|
+
if !File.directory?(file_path) && ext_name == '.rb'
|
111
|
+
file_name = File.basename(file_path).sub('.rb', '')
|
112
|
+
handler_name = "MessageHandler_#{msg_name}_#{file_name}"
|
113
|
+
|
114
|
+
load_handler(msg_name, file_path, handler_name)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
self
|
119
|
+
end
|
120
|
+
|
121
|
+
# Extract the top level dir or file name as it is the msg name
|
122
|
+
#
|
123
|
+
# @param [String] file_path path to check - this can be a directory or file
|
124
|
+
def get_msg_name(file_path)
|
125
|
+
base_name = File.basename(file_path)
|
126
|
+
ext_name = File.extname(base_name)
|
127
|
+
file_name = base_name.sub(ext_name, '')
|
128
|
+
|
129
|
+
msg_name = file_name
|
130
|
+
end
|
131
|
+
|
132
|
+
# Load top level handlers from the given directory
|
133
|
+
#
|
134
|
+
# @param [String] baseDir directory to check - should not have trailing slash
|
135
|
+
def load_handlers_from_top_level_path(base_dir)
|
136
|
+
RServiceBus.rlog "HandlerLoader.loadHandlersFromTopLevelPath. baseDir: #{base_dir}"
|
137
|
+
get_list_of_files_for_dir(base_dir).each do |file_path|
|
138
|
+
unless file_path.end_with?('.')
|
139
|
+
msg_name = get_msg_name(file_path)
|
140
|
+
if File.directory?(file_path)
|
141
|
+
load_handlers_from_second_level_path(msg_name, file_path)
|
142
|
+
else
|
143
|
+
handler_name = "MessageHandler_#{msg_name}"
|
144
|
+
load_handler(msg_name, file_path, handler_name)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
self
|
150
|
+
end
|
151
|
+
|
152
|
+
# Entry point for loading handlers
|
153
|
+
#
|
154
|
+
# @param [String] baseDir directory to check - should not have trailing
|
155
|
+
# slash
|
156
|
+
def load_handlers_from_path(base_dir)
|
157
|
+
load_handlers_from_top_level_path(base_dir)
|
158
|
+
|
159
|
+
self
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
module RServiceBus
|
2
|
+
# Given a directory, this class is responsible for finding
|
3
|
+
# msgnames,
|
4
|
+
# handlernames, and
|
5
|
+
# loading handlers
|
6
|
+
class HandlerManager
|
7
|
+
# Constructor
|
8
|
+
#
|
9
|
+
# @param [RServiceBus::Host] host instance
|
10
|
+
# @param [Hash] app_resources As hash[k,v] where k is the name of a resource, and v is the resource
|
11
|
+
def initialize(host, resource_manager, state_manager)
|
12
|
+
@host = host
|
13
|
+
@resource_manager = resource_manager
|
14
|
+
@state_manager = state_manager
|
15
|
+
|
16
|
+
@handler_list = {}
|
17
|
+
@resource_list_by_handler_name = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
# setBusAttributeIfRequested
|
21
|
+
#
|
22
|
+
# @param [RServiceBus::Handler] handler
|
23
|
+
def set_bus_attribute_if_requested(handler)
|
24
|
+
if defined?(handler.bus)
|
25
|
+
handler.bus = @host
|
26
|
+
RServiceBus.log 'Bus attribute set for: ' + handler.class.name
|
27
|
+
end
|
28
|
+
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
32
|
+
# setStateAttributeIfRequested
|
33
|
+
#
|
34
|
+
# @param [RServiceBus::Handler] handler
|
35
|
+
def set_state_attribute_if_requested(handler)
|
36
|
+
if defined?(handler.State)
|
37
|
+
handler.State = @state_manager.get(handler)
|
38
|
+
RServiceBus.log 'Bus attribute set for: ' + handler.class.name
|
39
|
+
end
|
40
|
+
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
# checkIfStateAttributeRequested
|
45
|
+
#
|
46
|
+
# @param [RServiceBus::Handler] handler
|
47
|
+
def check_if_state_attribute_requested(handler)
|
48
|
+
@state_manager.Required if defined?(handler.state)
|
49
|
+
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
def interrogate_handler_for_app_resources(handler)
|
54
|
+
RServiceBus.rlog "Checking app resources for: #{handler.class.name}"
|
55
|
+
RServiceBus.rlog "If your attribute is not getting set, check that it is in the 'attr_accessor' list"
|
56
|
+
|
57
|
+
@resource_list_by_handler_name[handler.class.name] = []
|
58
|
+
@resource_manager.get_all.each do |k, v|
|
59
|
+
next unless handler.class.method_defined?(k)
|
60
|
+
|
61
|
+
@resource_list_by_handler_name[handler.class.name] << k
|
62
|
+
RServiceBus.log "Resource attribute, #{k}, found for: " +
|
63
|
+
handler.class.name
|
64
|
+
end
|
65
|
+
|
66
|
+
self
|
67
|
+
end
|
68
|
+
|
69
|
+
def add_handler(msg_name, handler)
|
70
|
+
@handler_list[msg_name] = [] if @handler_list[msg_name].nil?
|
71
|
+
return unless @handler_list[msg_name].index{ |x| x.class.name == handler.class.name }.nil?
|
72
|
+
|
73
|
+
@handler_list[msg_name] << handler
|
74
|
+
set_bus_attribute_if_requested(handler)
|
75
|
+
check_if_state_attribute_requested(handler)
|
76
|
+
interrogate_handler_for_app_resources(handler)
|
77
|
+
end
|
78
|
+
|
79
|
+
# As named
|
80
|
+
#
|
81
|
+
# @param [String] msgName
|
82
|
+
# @param [Array] appResources A list of appResource
|
83
|
+
def get_list_of_resources_needed_to_process_msg(msg_name)
|
84
|
+
return [] if @handler_list[msg_name].nil?
|
85
|
+
|
86
|
+
list = []
|
87
|
+
@handler_list[msg_name].each do |handler|
|
88
|
+
list = list + @resource_list_by_handler_name[handler.class.name] unless @resource_list_by_handler_name[handler.class.name].nil?
|
89
|
+
end
|
90
|
+
list.uniq!
|
91
|
+
end
|
92
|
+
|
93
|
+
def set_resources_for_handlers_needed_to_process_msg(msg_name)
|
94
|
+
@handler_list[msg_name].each do |handler|
|
95
|
+
set_state_attribute_if_requested(handler)
|
96
|
+
|
97
|
+
next if @resource_list_by_handler_name[handler.class.name].nil?
|
98
|
+
@resource_list_by_handler_name[handler.class.name].each do |k|
|
99
|
+
handler.instance_variable_set("@#{k}", @resource_manager.get(k).get_resource)
|
100
|
+
RServiceBus.rlog "App resource attribute, #{k}, set for: " + handler.class.name
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def get_handler_list_for_msg(msg_name)
|
106
|
+
return [] if @handler_list[msg_name].nil?
|
107
|
+
|
108
|
+
list = get_list_of_resources_needed_to_process_msg(msg_name)
|
109
|
+
set_resources_for_handlers_needed_to_process_msg(msg_name)
|
110
|
+
|
111
|
+
@handler_list[msg_name]
|
112
|
+
end
|
113
|
+
|
114
|
+
def can_msg_be_handled_locally(msg_name)
|
115
|
+
@handler_list.key?(msg_name)
|
116
|
+
end
|
117
|
+
|
118
|
+
def get_stats
|
119
|
+
list = []
|
120
|
+
@handler_list.each do |k, v|
|
121
|
+
list << v.inspect
|
122
|
+
end
|
123
|
+
|
124
|
+
list
|
125
|
+
end
|
126
|
+
|
127
|
+
def get_list_of_msg_names
|
128
|
+
@handler_list.keys
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|