stomp_message 0.1.8 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Manifest.txt +5 -1
- data/README.txt +68 -1
- data/bin/jms_message_send.rb +69 -0
- data/bin/jms_ping.rb +62 -0
- data/bin/jms_server_standalone.rb +50 -0
- data/bin/jms_topic_listener.rb +72 -0
- data/bin/stomp_message_send.rb +7 -26
- data/lib/stomp_message/jms_tools.rb +315 -0
- data/lib/stomp_message/message.rb +23 -11
- data/lib/stomp_message/stomp_send_topic.rb +137 -18
- data/lib/stomp_message/stomp_server.rb +229 -31
- data/lib/stomp_message/stomp_statistics_server.rb +3 -2
- data/lib/stomp_message/stomp_z_active_record_server.rb +79 -12
- data/lib/stomp_message/version.rb +2 -2
- data/script/destroy +0 -0
- data/script/generate +0 -0
- data/script/txt2html +0 -0
- data/test/test_stomp_message.rb +3 -28
- metadata +50 -39
- data/lib/stomp_message/stomp_participant.rb +0 -100
@@ -42,6 +42,7 @@ module StompMessage
|
|
42
42
|
end
|
43
43
|
def stomp_PING(msg, stomp_msg)
|
44
44
|
puts "stomp PING: #{msg.body}" if @debug
|
45
|
+
[false,'']
|
45
46
|
#do not reply as statistic servers do no respond to pings. they respond to stomp_REPORT
|
46
47
|
end
|
47
48
|
#def create_statistics(msg) # k[it]=0 if !k.key?(it)
|
@@ -68,8 +69,7 @@ module StompMessage
|
|
68
69
|
}
|
69
70
|
puts result if @debug
|
70
71
|
reply_msg = StompMessage::Message.new('stomp_REPLY', "#{result}")
|
71
|
-
|
72
|
-
result
|
72
|
+
[true, reply_msg]
|
73
73
|
end
|
74
74
|
def stomp_RESET(msg, stomp_msg)
|
75
75
|
puts "stomp reset: #{msg.body}" if @debug
|
@@ -78,6 +78,7 @@ module StompMessage
|
|
78
78
|
self.statistics[reset_tag].each { |k,v| self.statistics[reset_tag][k]=0
|
79
79
|
puts "RESET: tag #{k} value is zero"
|
80
80
|
} if self.tags.include?(msg.body.to_s)
|
81
|
+
[false,'']
|
81
82
|
end
|
82
83
|
end
|
83
84
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'erb'
|
3
|
+
require 'socket'
|
3
4
|
|
4
5
|
#require 'stomp_server'
|
5
6
|
module StompMessage
|
@@ -7,6 +8,7 @@ module StompMessage
|
|
7
8
|
# had to name it Z due to order problems. not sure why.
|
8
9
|
class StompZActiveRecordServer < StompMessage::StompServer
|
9
10
|
attr_accessor :model_list
|
11
|
+
attr_reader :database_env
|
10
12
|
def initialize(options={})
|
11
13
|
super(options)
|
12
14
|
puts "root_path: #{options[:root_path]} rails_environment #{options[:env]}"
|
@@ -18,15 +20,32 @@ def initialize(options={})
|
|
18
20
|
#note this is specific tomysql... need to fix later
|
19
21
|
def check_active_record_connection(my_class)
|
20
22
|
begin
|
21
|
-
|
22
|
-
puts " checking AR connection status: #{
|
23
|
-
puts " AR down... reconnecting" if !
|
23
|
+
ar_conn=my_class.new.connection
|
24
|
+
puts " checking AR connection status: #{ar_conn.active?}"
|
25
|
+
puts " AR down... reconnecting" if !ar_conn.active?
|
24
26
|
# puts "after first check"
|
25
|
-
|
27
|
+
ar_conn.reconnect! if !ar_conn.active?
|
26
28
|
# puts "after reconnect"
|
27
29
|
rescue Mysql::Error
|
28
30
|
puts "reconnecting due to Mysql:Error"
|
29
|
-
|
31
|
+
ar_conn.reconnect
|
32
|
+
rescue Exception => e
|
33
|
+
puts "ActiveRecord found exception that should not be here #{e.message}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
def check_ar_connection
|
37
|
+
begin
|
38
|
+
ActiveRecord::Base.establish_connection(self.database_env) if !ActiveRecord::Base.connected?
|
39
|
+
|
40
|
+
ar_conn=ActiveRecord::Base.connection
|
41
|
+
puts " checking AR connection status: #{ar_conn.active?}"
|
42
|
+
puts " AR down... reconnecting" if !ar_conn.active?
|
43
|
+
# puts "after first check"
|
44
|
+
ar_conn.reconnect! if !ar_conn.active?
|
45
|
+
# puts "after reconnect"
|
46
|
+
rescue Mysql::Error
|
47
|
+
puts "reconnecting due to Mysql:Error"
|
48
|
+
ar_conn.reconnect
|
30
49
|
rescue Exception => e
|
31
50
|
puts "ActiveRecord found exception that should not be here #{e.message}"
|
32
51
|
end
|
@@ -43,20 +62,41 @@ def monitor_ar_status(connection)
|
|
43
62
|
end # while
|
44
63
|
}
|
45
64
|
end
|
65
|
+
#RAILS_ENV= 'production' if RUBY_PLATFORM =~ /java/
|
46
66
|
# the model path needs to include the models for active record... can be inferred from
|
47
67
|
# table names if needed but easiest and simplest is to give path to to the rails application
|
48
|
-
def setup_active_record(root_path,
|
68
|
+
def setup_active_record(root_path,tenv)
|
49
69
|
require 'rubygems'
|
70
|
+
if self.java?
|
71
|
+
env = 'development'
|
72
|
+
env = 'production' if Socket.gethostname=='svbalance.cure.com.ph'
|
73
|
+
env = tenv if tenv!=nil
|
74
|
+
end
|
75
|
+
# env = 'production' #now using connection pools so always production
|
76
|
+
#ENV['RAILS_ENV'] ||= env
|
77
|
+
#RAILS_ENV=env
|
50
78
|
gem 'activerecord'
|
51
79
|
require 'active_record'
|
80
|
+
|
81
|
+
# ENV['RAILS_ENV'] ||= env
|
82
|
+
# RAILS_ENV=env
|
52
83
|
path= root_path + "config/database.yml"
|
53
|
-
puts "path is #{path}"
|
84
|
+
puts "path is #{path}" if @debug
|
54
85
|
data=File.open(path).readlines.join
|
86
|
+
# puts "file open"
|
55
87
|
result=ERB.new(data).result
|
88
|
+
# puts "after erb #{result}"
|
56
89
|
parsed=YAML.load(result)
|
57
|
-
|
58
|
-
|
59
|
-
|
90
|
+
# puts " values are: #{parsed.to_s}" # if @debug
|
91
|
+
puts "env is #{env} values are: #{parsed[env]}" if @debug
|
92
|
+
|
93
|
+
@database_env=parsed[env]
|
94
|
+
# puts "db temp #{self.database_env.to_s}"
|
95
|
+
puts "Database settings: #{self.database_env.inspect} from environment #{env} in database.yml"
|
96
|
+
puts "JNDI Needed: #{self.database_env['jndi']} please ensure configured!" if self.database_env['jndi'] !=nil
|
97
|
+
ActiveRecord::Base.allow_concurrency = true
|
98
|
+
establish_ar_jdbc_pool
|
99
|
+
ActiveRecord::Base.logger = Logger.new(STDOUT) #RAILS_DEFAULT_LOGGER
|
60
100
|
# grab all the models
|
61
101
|
# model_path = root_path + "app/models/*.rb"
|
62
102
|
load_models(root_path)
|
@@ -64,6 +104,26 @@ def setup_active_record(root_path,env)
|
|
64
104
|
end
|
65
105
|
#load the AR models... override if necessary
|
66
106
|
# model list is an array of models to load
|
107
|
+
def onMessage(msg_body,msg_hash)
|
108
|
+
puts "----> Stomp Z AR on Message"
|
109
|
+
if check_origin(msg_hash)
|
110
|
+
establish_ar_jdbc_pool
|
111
|
+
super(msg_body,msg_hash)
|
112
|
+
free_ar_jdbc_pool
|
113
|
+
end
|
114
|
+
msg_body=msg_hash=nil
|
115
|
+
puts "<---- Stomp Z AR on Message exit"
|
116
|
+
|
117
|
+
end
|
118
|
+
def establish_ar_jdbc_pool
|
119
|
+
puts "----- establish jdbc pool"
|
120
|
+
check_ar_connection
|
121
|
+
end
|
122
|
+
def free_ar_jdbc_pool
|
123
|
+
puts "---- free pool"
|
124
|
+
# ActiveRecord::Base.connection.disconnect!
|
125
|
+
# ActiveRecord::Base.remove_connection
|
126
|
+
end
|
67
127
|
def load_models(root_path)
|
68
128
|
model_path = root_path + "app/models/"
|
69
129
|
# puts "model path is #{model_path}"
|
@@ -71,11 +131,18 @@ def setup_active_record(root_path,env)
|
|
71
131
|
self.model_list.each { |model_file|
|
72
132
|
lib = model_path + model_file
|
73
133
|
last_model = require lib
|
74
|
-
puts "loading required model: is #{lib}"
|
134
|
+
puts "loading required model: is #{lib}" if @debug
|
75
135
|
# last_model=lib #last one needs to be active_record (need to fix)
|
76
136
|
}
|
77
137
|
puts "last model is #{last_model}"
|
78
|
-
monitor_ar_status(eval("#{last_model[0]}"))
|
138
|
+
monitor_ar_status(eval("#{last_model[0]}")) if !self.java?
|
79
139
|
end
|
140
|
+
def server_shutdown
|
141
|
+
puts "---->shutting down AR"
|
142
|
+
free_ar_jdbc_pool
|
143
|
+
super
|
144
|
+
puts "<----shut down AR"
|
145
|
+
|
146
|
+
end
|
80
147
|
end # class
|
81
148
|
end #module
|
data/script/destroy
CHANGED
File without changes
|
data/script/generate
CHANGED
File without changes
|
data/script/txt2html
CHANGED
File without changes
|
data/test/test_stomp_message.rb
CHANGED
@@ -1,12 +1,7 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
-
|
3
|
-
def reply_to_engine(workitem)
|
4
|
-
puts "hello from test reply to engine"
|
5
|
-
end
|
6
|
-
end
|
2
|
+
|
7
3
|
require 'rubygems'
|
8
|
-
|
9
|
-
require 'openwfe/workitem'
|
4
|
+
|
10
5
|
gem 'stomp_message'
|
11
6
|
require 'stomp_message'
|
12
7
|
class TestStompMessage < Test::Unit::TestCase
|
@@ -202,25 +197,5 @@ class TestStompMessage < Test::Unit::TestCase
|
|
202
197
|
ss_thread.kill
|
203
198
|
end
|
204
199
|
|
205
|
-
|
206
|
-
#note activemq or stomp message bus needs to be running
|
207
|
-
args={}
|
208
|
-
args[:topic] = '/topic/test'
|
209
|
-
ss=StompMessage::StompServer.new(args)
|
210
|
-
ss_thread = Thread.new {
|
211
|
-
ss.run }
|
212
|
-
assert ss.topic=='/topic/test', "topic not set properly"
|
213
|
-
participant=OpenWFE::StompParticipant.new('/topic/test') { puts "hello from block"}
|
214
|
-
wi = OpenWFE::WorkItem.new()
|
215
|
-
wi[:command] = 'stomp_PING'
|
216
|
-
wi[:body] = 'body'
|
217
|
-
wi[:msisdn] = '63999999'
|
218
|
-
m2=StompMessage::Message.new(wi[:command].to_s,wi[:body].to_s)
|
219
|
-
puts "m2: #{m2.to_xml}"
|
220
|
-
assert m2.to_xml==StompMessage::Message.load_xml(m2.to_xml).to_xml, "problems in wi xml"
|
221
|
-
wi['sms'] = "hello there"
|
222
|
-
participant.consume(wi)
|
223
|
-
ss_thread.kill
|
224
|
-
|
225
|
-
end
|
200
|
+
|
226
201
|
end
|
metadata
CHANGED
@@ -1,33 +1,16 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
2
|
-
|
3
|
-
specification_version: 1
|
4
|
-
name: stomp_message
|
5
|
-
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.8
|
7
|
-
date: 2007-11-05 00:00:00 +08:00
|
8
|
-
summary: handling stomp messages and servers
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: scott dot sproule at ficonab dot com
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
extensions: []
|
12
3
|
homepage: http://stompmessage.rubyforge.org
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
25
|
-
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
4
|
+
executables:
|
5
|
+
- stomp_message_send.rb
|
6
|
+
- jms_server_standalone.rb
|
7
|
+
- jms_message_send.rb
|
8
|
+
- jms_ping.rb
|
9
|
+
- jms_topic_listener.rb
|
10
|
+
version: !ruby/object:Gem::Version
|
11
|
+
version: 0.6.3
|
28
12
|
post_install_message:
|
29
|
-
|
30
|
-
- scott sproule
|
13
|
+
date: 2008-06-24 16:00:00 +00:00
|
31
14
|
files:
|
32
15
|
- History.txt
|
33
16
|
- License.txt
|
@@ -38,14 +21,18 @@ files:
|
|
38
21
|
- config/requirements.rb
|
39
22
|
- lib/stomp_message.rb
|
40
23
|
- lib/stomp_message/version.rb
|
24
|
+
- lib/stomp_message/jms_tools.rb
|
41
25
|
- lib/stomp_message/stomp_server.rb
|
42
26
|
- lib/stomp_message/stomp_statistics_server.rb
|
43
27
|
- lib/stomp_message/stomp_z_active_record_server.rb
|
44
28
|
- lib/stomp_message/stomp_send_topic.rb
|
45
|
-
- lib/stomp_message/stomp_participant.rb
|
46
29
|
- lib/stomp_message/message.rb
|
47
30
|
- log/debug.log
|
48
31
|
- bin/stomp_message_send.rb
|
32
|
+
- bin/jms_server_standalone.rb
|
33
|
+
- bin/jms_message_send.rb
|
34
|
+
- bin/jms_ping.rb
|
35
|
+
- bin/jms_topic_listener.rb
|
49
36
|
- script/destroy
|
50
37
|
- script/generate
|
51
38
|
- script/txt2html
|
@@ -55,22 +42,46 @@ files:
|
|
55
42
|
- tasks/website.rake
|
56
43
|
- test/test_helper.rb
|
57
44
|
- test/test_stomp_message.rb
|
58
|
-
|
59
|
-
- test/test_helper.rb
|
60
|
-
- test/test_stomp_message.rb
|
45
|
+
rubygems_version: 1.1.0
|
61
46
|
rdoc_options:
|
62
47
|
- --main
|
63
48
|
- README.txt
|
49
|
+
signing_key:
|
50
|
+
cert_chain: []
|
51
|
+
name: stomp_message
|
52
|
+
has_rdoc: true
|
53
|
+
platform: ruby
|
54
|
+
summary: handling stomp messages and servers
|
55
|
+
default_executable:
|
56
|
+
bindir: bin
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
version:
|
59
|
+
requirements:
|
60
|
+
- - '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: !str 0
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
version:
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: !str 0
|
69
|
+
require_paths:
|
70
|
+
- lib
|
71
|
+
specification_version: 2
|
72
|
+
test_files:
|
73
|
+
- test/test_helper.rb
|
74
|
+
- test/test_stomp_message.rb
|
75
|
+
dependencies: []
|
76
|
+
description: handling stomp messages and servers
|
77
|
+
email: scott dot sproule at ficonab dot com
|
78
|
+
authors:
|
79
|
+
- scott sproule
|
64
80
|
extra_rdoc_files:
|
65
81
|
- History.txt
|
66
82
|
- License.txt
|
67
83
|
- Manifest.txt
|
68
84
|
- README.txt
|
69
|
-
executables:
|
70
|
-
- stomp_message_send.rb
|
71
|
-
extensions: []
|
72
|
-
|
73
85
|
requirements: []
|
74
|
-
|
75
|
-
|
76
|
-
|
86
|
+
rubyforge_project: stompmessage
|
87
|
+
autorequire:
|
@@ -1,100 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'timeout'
|
3
|
-
gem 'openwferu'
|
4
|
-
require 'openwfe/participants/participants'
|
5
|
-
|
6
|
-
|
7
|
-
module OpenWFE
|
8
|
-
|
9
|
-
#
|
10
|
-
# Participant to send/receive work items to stomp message servers applications
|
11
|
-
# send message and asynch wait for response
|
12
|
-
#
|
13
|
-
# Timeoout may need to be changed
|
14
|
-
#
|
15
|
-
# On the return side, you can override the method handle_call_result
|
16
|
-
# for better mappings between messages calls and the workitems.
|
17
|
-
#
|
18
|
-
class StompParticipant
|
19
|
-
include LocalParticipant
|
20
|
-
attr_accessor :timeout_val, :options, :msg_sender
|
21
|
-
def initialize(topic, host='localhost', port=61613, timeout=4, &block)
|
22
|
-
|
23
|
-
|
24
|
-
self.options={}
|
25
|
-
self.options[:host]=host
|
26
|
-
self.options[:port]=port
|
27
|
-
self.options[:topic]=topic
|
28
|
-
self.timeout_val = timeout
|
29
|
-
self.msg_sender=StompMessage::StompSendTopic.new(self.options)
|
30
|
-
self.msg_sender.setup_auto_close
|
31
|
-
end
|
32
|
-
|
33
|
-
#
|
34
|
-
# The method called by the engine when the flow reaches an instance
|
35
|
-
# of this Participant class.
|
36
|
-
#
|
37
|
-
def consume (workitem)
|
38
|
-
|
39
|
-
m=prepare_call_params(workitem)
|
40
|
-
puts "message is: #{m.to_xml}"
|
41
|
-
# billing_sender.send_topic(m.body, arg_hash[:msisdn])
|
42
|
-
# m=StompMessage::Message.new('stomp_BILLING', msg)
|
43
|
-
header={}
|
44
|
-
# header[:msisdn]=workitem.attributes[:msisdn]
|
45
|
-
begin
|
46
|
-
Timeout::timeout(self.timeout_val) {
|
47
|
-
self.msg_sender.send_topic_acknowledge(m,header) {
|
48
|
-
|msg| workitem=handle_call_result(msg, workitem)
|
49
|
-
}
|
50
|
-
}
|
51
|
-
rescue Timeout::Error
|
52
|
-
puts "STOMP participant:: consume(wi) exception"
|
53
|
-
workitem.attributes["__result__"]=false
|
54
|
-
workitem.attributes["stomp_TIMEOUT"]=true
|
55
|
-
# raise "timeout"
|
56
|
-
ensure
|
57
|
-
reply_to_engine(workitem)
|
58
|
-
end
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
#
|
65
|
-
# The base implementation :prepares the message
|
66
|
-
# param there is a workitem field with the same name.
|
67
|
-
#
|
68
|
-
# Feel free to override this method.
|
69
|
-
#
|
70
|
-
def prepare_call_params (workitem)
|
71
|
-
m=StompMessage::Message.new(workitem.attributes[:command].to_s,
|
72
|
-
workitem.attributes[:body].to_s)
|
73
|
-
m
|
74
|
-
# puts "message is: #{m.to_xml}"
|
75
|
-
end
|
76
|
-
|
77
|
-
#
|
78
|
-
# This implementation simply stuffs the result into the workitem
|
79
|
-
# as an attribute named "__result__".
|
80
|
-
#
|
81
|
-
# Feel free to override this method.
|
82
|
-
#
|
83
|
-
def handle_call_result (result, workitem)
|
84
|
-
|
85
|
-
puts 'in handle action block'
|
86
|
-
puts 'MESSAGE RECEIVED ----'
|
87
|
-
m= StompMessage::Message.load_xml(result)
|
88
|
-
workitem.attributes["__result__"]=m.to_xml
|
89
|
-
workitem.attributes["command"]=m.command.to_s
|
90
|
-
workitem.attributes["body"]=m.body.to_s
|
91
|
-
puts "wi #{workitem.attributes.to_s}"
|
92
|
-
workitem
|
93
|
-
|
94
|
-
end
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
end
|
99
|
-
|
100
|
-
end
|