ekaranto-rubywmq 2.0.0

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.
Files changed (51) hide show
  1. data/.document +4 -0
  2. data/LICENSE.txt +201 -0
  3. data/README.md +408 -0
  4. data/Rakefile +87 -0
  5. data/examples/each_a.rb +16 -0
  6. data/examples/each_b.rb +25 -0
  7. data/examples/each_header.rb +22 -0
  8. data/examples/files_to_q.cfg +24 -0
  9. data/examples/files_to_q.rb +31 -0
  10. data/examples/get_a.rb +19 -0
  11. data/examples/get_client.rb +35 -0
  12. data/examples/put1_a.rb +9 -0
  13. data/examples/put1_b.rb +17 -0
  14. data/examples/put1_c.rb +16 -0
  15. data/examples/put_a.rb +19 -0
  16. data/examples/put_b.rb +27 -0
  17. data/examples/put_dlh.rb +25 -0
  18. data/examples/put_dynamic_q.rb +22 -0
  19. data/examples/put_group_a.rb +35 -0
  20. data/examples/put_group_b.rb +37 -0
  21. data/examples/put_rfh.rb +51 -0
  22. data/examples/put_rfh2_a.rb +27 -0
  23. data/examples/put_rfh2_b.rb +27 -0
  24. data/examples/put_xmit_q.rb +17 -0
  25. data/examples/q_to_files.cfg +17 -0
  26. data/examples/q_to_files.rb +32 -0
  27. data/examples/request.rb +44 -0
  28. data/examples/server.rb +81 -0
  29. data/ext/decode_rfh.c +348 -0
  30. data/ext/decode_rfh.h +45 -0
  31. data/ext/extconf.rb +30 -0
  32. data/ext/extconf_client.rb +24 -0
  33. data/ext/generate/generate_const.rb +140 -0
  34. data/ext/generate/generate_reason.rb +233 -0
  35. data/ext/generate/generate_structs.rb +82 -0
  36. data/ext/generate/wmq_structs.erb +341 -0
  37. data/ext/wmq.c +90 -0
  38. data/ext/wmq.h +371 -0
  39. data/ext/wmq_message.c +671 -0
  40. data/ext/wmq_mq_load.c +217 -0
  41. data/ext/wmq_queue.c +1411 -0
  42. data/ext/wmq_queue_manager.c +1570 -0
  43. data/lib/rubywmq.rb +1 -0
  44. data/lib/wmq/message.rb +70 -0
  45. data/lib/wmq/queue_manager.rb +110 -0
  46. data/lib/wmq/version.rb +3 -0
  47. data/lib/wmq.rb +16 -0
  48. data/nbproject/project.properties +11 -0
  49. data/nbproject/project.xml +17 -0
  50. data/tests/test.rb +318 -0
  51. metadata +115 -0
data/lib/rubywmq.rb ADDED
@@ -0,0 +1 @@
1
+ require 'wmq'
@@ -0,0 +1,70 @@
1
+ # Message Ruby methods
2
+ module WMQ
3
+ # Message contains the message descriptor (MQMD), data
4
+ # and any headers.
5
+ #
6
+ # Note:
7
+ # * The format in the descriptor applies only to the format of the data portion,
8
+ # not the format of any included headers
9
+ # * The message format can ONLY be supplied in the descriptor.
10
+ # * I.e. It is the format of the data, Not the headers.
11
+ # * On the wire formats are determined automatically by the :header_type key for
12
+ # each header
13
+ # * Other WebSphere MQ interfaces require that the formats be "daisy-chained"
14
+ # * I.e. The MQMD.Format is actually the format of the first header
15
+ # * Ruby WMQ removes this tedious requirement and performs this
16
+ # requirement automatically under the covers
17
+ # * The format of any header should not be supplied in the descriptor or any header
18
+ #
19
+ # Message has the following attributes:
20
+ # * descriptor = {
21
+ # # WebSphere MQ Equivalent
22
+ # :format => WMQ::MQFMT_STRING, # MQMD.Format - Format of data only
23
+ # WMQ::MQFMT_NONE # Do not supply header formats here
24
+ # :original_length => Number # MQMD.OriginalLength
25
+ # :priority => 0 .. 9 # MQMD.Priority
26
+ # :put_time => String # MQMD.PutTime
27
+ # :msg_id => String ...
28
+ # :expiry => Number
29
+ # :persistence => Number
30
+ # :reply_to_q => String
31
+ # :correl_id => String
32
+ # :feedback => Number
33
+ # :offset => Number
34
+ # :report => Number
35
+ # :msg_flags => Number
36
+ # :reply_to_q_mgr => String
37
+ # :appl_identity_data => String
38
+ # :put_appl_name => String
39
+ # :user_identifier => String
40
+ # :msg_seq_number => Number
41
+ # :appl_origin_data => String
42
+ # :accounting_token => String
43
+ # :backout_count => Number
44
+ # :coded_char_set_id => Number
45
+ # :put_appl_type => Number
46
+ # :msg_type => Number
47
+ # :group_id => String
48
+ # :put_date => String
49
+ # :encoding => Number
50
+ # }
51
+ # * data => String
52
+ # * headers => Array of Hashes
53
+ # * Note: Do not supply the format of any header. Ruby WMQ does this for you.
54
+ #
55
+ # The following headers are supported:
56
+ # * Rules And Formatting Header (RFH)
57
+ # :header_type => :rf_header
58
+ # :....
59
+ # * Rules and Formatting V2 Header (RFH2)
60
+ # ....
61
+ # * Dead Letter Header
62
+ # * CICS Header
63
+ # * IMS Header
64
+ # * Transmission Queue Header
65
+ # * ...
66
+ class Message
67
+ attr_accessor :data, :descriptor, :headers
68
+ end
69
+
70
+ end
@@ -0,0 +1,110 @@
1
+ # QueueManager ruby methods
2
+ module WMQ
3
+ class QueueManager
4
+ # Execute any MQSC command against the queue manager
5
+ #
6
+ # Example
7
+ # require 'wmq/wmq'
8
+ # require 'wmq/wmq_const_admin'
9
+ # WMQ::QueueManager.connect(:q_mgr_name=>'REID', :connection_name=>'localhost(1414)') do |qmgr|
10
+ # qmgr.mqsc('dis ql(*)').each {|item| p item }
11
+ # end
12
+ def mqsc(mqsc_text)
13
+ self.execute(:command=>:escape, :escape_type=>WMQ::MQET_MQSC, :escape_text=>mqsc_text).collect {|item| item[:escape_text] }
14
+ end
15
+
16
+ # Put a reply message back to the sender
17
+ #
18
+ # The :message is sent to the queue and queue manager specified in the
19
+ # :reply_to_q and :reply_to_q_mgr propoerties of the :request_message.
20
+ #
21
+ # The following rules are followed before sending the reply:
22
+ # - Only send replies to Request messages. No reply for Datagrams
23
+ # - Set the message type to Reply when replying to a request message
24
+ # - Reply with:
25
+ # - Remaining Expiry (Ideally deduct any processing time since get)
26
+ # - Same priority as received message
27
+ # - Same persistence as received message
28
+ # - Adhere to the Report options supplied for message and correlation id's
29
+ # in reply message
30
+ # - All headers must be returned on reply messages
31
+ # - This allows the calling application to store state information
32
+ # in these headers
33
+ # - Unless of course if the relevant header is input only and used
34
+ # for completing the request
35
+ # - In this case any remaining headers should be returned
36
+ # to the caller
37
+ #
38
+ # Parameters:
39
+ # * :request_message The message originally received
40
+ # * All the other parameters are the same as QueueManager#put
41
+ #
42
+ def put_to_reply_q(parms)
43
+ # Send replies only if message type is request
44
+ if parms[:request_message].descriptor[:msg_type] == WMQ::MQMT_REQUEST
45
+ request = parms.delete(:request_message)
46
+
47
+ reply = parms[:message] ||= Message.new(:data=>parms[:data])
48
+ reply.descriptor[:msg_type] = WMQ::MQMT_REPLY
49
+ reply.descriptor[:expiry] = request.descriptor[:expiry]
50
+ reply.descriptor[:priority] = request.descriptor[:priority]
51
+ reply.descriptor[:persistence]= request.descriptor[:persistence]
52
+ reply.descriptor[:format] = request.descriptor[:format]
53
+
54
+ # Set Correlation Id based on report options supplied
55
+ if request.descriptor[:report] & WMQ::MQRO_PASS_CORREL_ID != 0
56
+ reply.descriptor[:correl_id] = request.descriptor[:correl_id]
57
+ else
58
+ reply.descriptor[:correl_id] = request.descriptor[:msg_id]
59
+ end
60
+
61
+ # Set Message Id based on report options supplied
62
+ if request.descriptor[:report] & WMQ::MQRO_PASS_MSG_ID != 0
63
+ reply.descriptor[:msg_id] = request.descriptor[:msg_id]
64
+ end
65
+
66
+ parms[:q_name] = request.descriptor[:reply_to_q]
67
+ parms[:q_mgr_name]= request.descriptor[:reply_to_q_mgr]
68
+ return put(parms)
69
+ else
70
+ return false
71
+ end
72
+ end
73
+
74
+ # Put a message to the Dead Letter Queue
75
+ #
76
+ # If an error occurs when processing a datagram message
77
+ # it is necessary to move the message to the dead letter queue.
78
+ # I.e. An error message cannot be sent back to the sender because
79
+ # the original message was not a request message.
80
+ # I.e. msg_type != WMQ::MQMT_REQUEST
81
+ #
82
+ # All existing message data, message descriptor and message headers
83
+ # are retained.
84
+ #
85
+ def put_to_dead_letter_q(parms)
86
+ message = parms[:message] ||= Message.new(:data=>parms[:data])
87
+ dlh = {
88
+ :header_type =>:dead_letter_header,
89
+ :reason =>parms.delete(:reason),
90
+ :dest_q_name =>parms.delete(:q_name),
91
+ :dest_q_mgr_name =>self.name}
92
+
93
+ message.headers.unshift(dlh)
94
+ parms[:q_name]='SYSTEM.DEAD.LETTER.QUEUE' #TODO Should be obtained from QMGR config
95
+ return self.put(parms)
96
+ end
97
+
98
+ # Expose Commands directly as Queue Manager methods
99
+ def method_missing(name, *args)
100
+ if args.size == 1
101
+ self.execute({:command=>name}.merge(args[0]))
102
+ elsif args.size == 0
103
+ self.execute({:command=>name})
104
+ else
105
+ raise("Invalid arguments supplied to QueueManager#:#{name}, args:#{args}")
106
+ end
107
+ end
108
+
109
+ end
110
+ end
@@ -0,0 +1,3 @@
1
+ module WMQ #:nodoc
2
+ VERSION = "2.0.0"
3
+ end
data/lib/wmq.rb ADDED
@@ -0,0 +1,16 @@
1
+ require 'wmq/version'
2
+ require 'wmq/constants'
3
+ require 'wmq/constants_admin'
4
+ require 'wmq/queue_manager'
5
+ require 'wmq/message'
6
+
7
+ # Load wmq using the auto-load library.
8
+ #
9
+ # If it fails, then it is most likely since this platform is not supported
10
+ # by the auto load facility in Ruby WMQ, so try to load client linked library
11
+ # For Example AIX does not support Autoload whereas Windows and Linux are supported
12
+ begin
13
+ require 'wmq/wmq'
14
+ rescue LoadError
15
+ require 'wmq/wmq_client'
16
+ end
@@ -0,0 +1,11 @@
1
+ examples.dir=${file.reference.trunk-examples}
2
+ file.reference.trunk-examples=examples
3
+ file.reference.trunk-ext=ext
4
+ file.reference.trunk-lib=lib
5
+ file.reference.trunk-tests=tests
6
+ javac.classpath=
7
+ lib.dir=${file.reference.trunk-lib}
8
+ main.file=
9
+ source.encoding=UTF-8
10
+ src.dir=${file.reference.trunk-ext}
11
+ test.src.dir=${file.reference.trunk-tests}
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project xmlns="http://www.netbeans.org/ns/project/1">
3
+ <type>org.netbeans.modules.ruby.rubyproject</type>
4
+ <configuration>
5
+ <data xmlns="http://www.netbeans.org/ns/ruby-project/1">
6
+ <name>rubywmq</name>
7
+ <source-roots>
8
+ <root id="src.dir" name="ext"/>
9
+ <root id="examples.dir"/>
10
+ <root id="lib.dir" name="Source Files"/>
11
+ </source-roots>
12
+ <test-roots>
13
+ <root id="test.src.dir"/>
14
+ </test-roots>
15
+ </data>
16
+ </configuration>
17
+ </project>
data/tests/test.rb ADDED
@@ -0,0 +1,318 @@
1
+ # Allow test to be run in-place without requiring a gem install
2
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
3
+
4
+ require 'rubygems'
5
+ require 'wmq'
6
+ require 'test/unit'
7
+ class TestTest < Test::Unit::TestCase
8
+
9
+ def setup
10
+ puts '****** setup: start ******'
11
+ @queue_manager = WMQ::QueueManager.new(:q_mgr_name => 'TEST') #, :connection_name=>'localhost(1414)')
12
+ @queue_manager.connect
13
+
14
+ # Create Queue and clear any messages from the queue
15
+ @in_queue = WMQ::Queue.new(:queue_manager=>@queue_manager,
16
+ :mode=>:input,
17
+ :dynamic_q_name=>'UNIT.TEST.*',
18
+ :q_name=>'SYSTEM.DEFAULT.MODEL.QUEUE',
19
+ :fail_if_exists=>false)
20
+ @in_queue.open
21
+ @in_queue.each { |message| }
22
+
23
+ # Open same queue for Output. Queue should be created by now
24
+ @out_queue = WMQ::Queue.new(:queue_manager=>@queue_manager,
25
+ :mode=>:output,
26
+ :q_name=>@in_queue.name)
27
+ @out_queue.open
28
+ puts '****** setup: end ******'
29
+ end
30
+
31
+ def teardown
32
+ puts '****** teardown: start ******'
33
+ @out_queue.close
34
+ @in_queue.close
35
+ @queue_manager.disconnect
36
+ puts '****** teardown: end ******'
37
+ end
38
+
39
+ def test_exceptions
40
+ puts '****** test_exceptions: start ******'
41
+ assert_raise(TypeError) { WMQ::QueueManager.new(1) }
42
+ assert_nothing_raised { WMQ::QueueManager.new(:exception_on_error=>nil) }
43
+ assert_raise(TypeError) { WMQ::QueueManager.new(:exception_on_error=>1) }
44
+ assert_raise(TypeError) { WMQ::QueueManager.new(:q_mgr_name=>2).connect }
45
+ assert_raise(WMQ::WMQException) { WMQ::QueueManager.new(:q_mgr_name=>'bad').connect }
46
+ puts '****** test_exceptions: end ******'
47
+ end
48
+
49
+ def test_queue_manager
50
+ puts '****** test_queue_manager ******'
51
+ assert_equal(Object, WMQ::QueueManager.superclass)
52
+ assert_equal(WMQ::QueueManager, @queue_manager.class)
53
+ end
54
+
55
+ def test_1
56
+ puts '****** test_1 ******'
57
+ assert_equal(@out_queue.put(:data=>'Hello World'), true)
58
+ message = WMQ::Message.new
59
+ assert_equal(@in_queue.get(:message=>message), true)
60
+ assert_equal(message.data, 'Hello World')
61
+ end
62
+
63
+ def test_dynamic_buffer
64
+ puts '****** test_dynamic_buffer ******'
65
+ # Clear out queue of any messages
66
+ @in_queue.each { |message| }
67
+
68
+ test_sizes = [0, 1, 100, 101, 102, 500, 65534, 65535, 65536, 65537, 1*1024*1024, 4*1024*1024]
69
+ test_sizes.each do |size|
70
+ str = '0123456789ABCDEF' * (size/16) + '0123456789ABCDEF'[0,size%16]
71
+ assert_equal(str.length, size)
72
+ assert_equal(@out_queue.put(:data=>str), true)
73
+ end
74
+
75
+ # First test the browse mechanism
76
+ counter = 0
77
+ @queue_manager.open_queue(:mode=>:browse, :q_name=>@in_queue.name) do |browse_queue|
78
+ browse_queue.each do |message|
79
+ size = test_sizes[counter]
80
+ assert_equal(size, message.data.length)
81
+ str = '0123456789ABCDEF' * (size/16) + '0123456789ABCDEF'[0,size%16]
82
+ assert_equal(str, message.data)
83
+ counter = counter + 1
84
+ end
85
+ end
86
+ assert_equal(test_sizes.size, counter)
87
+
88
+ # Now retrieve the messages destructively
89
+ message = WMQ::Message.new
90
+ test_sizes.each do |size|
91
+ assert_equal(true, @in_queue.get(:message=>message, :match=>WMQ::MQMO_NONE))
92
+ assert_equal(size, message.data.length)
93
+ str = '0123456789ABCDEF' * (size/16) + '0123456789ABCDEF'[0,size%16]
94
+ assert_equal(str, message.data)
95
+ end
96
+ end
97
+
98
+ def test_q_name_hash
99
+ puts '****** test_q_name_hash ******'
100
+ @queue_manager.open_queue(:mode=>:output,
101
+ :q_name=>{:q_name=>@in_queue.name,
102
+ :q_mgr_name=>@queue_manager.name}
103
+ ) do |test_queue|
104
+ assert_equal(true, test_queue.put(:data=>'Hello World'))
105
+ message = WMQ::Message.new
106
+ assert_equal(true, @in_queue.get(:message=>message))
107
+ assert_equal('Hello World', message.data)
108
+ end
109
+ end
110
+
111
+ def test_execute
112
+ puts '****** test_execute ******'
113
+ array = @queue_manager.inquire_q(:q_name=>@in_queue.name, :q_type=>WMQ::MQQT_LOCAL, :current_q_depth=>nil)
114
+ assert_equal(1, array.size)
115
+ assert_equal(@in_queue.name, array[0][:q_name])
116
+
117
+ assert_equal(true, @queue_manager.inquire_process(:process_name=>'*').size>0)
118
+ assert_raise(WMQ::WMQException) { @queue_manager.inquire_q(:q_name=>'BADQUEUENAME*') }
119
+ assert_equal(1, @queue_manager.ping_q_mgr.size)
120
+ end
121
+
122
+ def test_mqsc
123
+ puts '****** test_mqsc ******'
124
+ array = @queue_manager.mqsc("dis ql(#{@in_queue.name})")
125
+ assert_equal(1, array.size)
126
+ assert_equal(true, array[0].include?("QUEUE(#{@in_queue.name})"))
127
+ end
128
+
129
+ def test_put1
130
+ puts '****** test_put1 ******'
131
+ data = 'Some Test Data'
132
+ assert_equal(true,@queue_manager.put(:q_name=>@in_queue.name, :data=>data))
133
+
134
+ message = WMQ::Message.new
135
+ assert_equal(true, @in_queue.get(:message=>message))
136
+ assert_equal(data, message.data)
137
+ end
138
+
139
+ def verify_header(header, format)
140
+ verify_multiple_headers([header], format)
141
+ end
142
+
143
+ def verify_multiple_headers(headers, format)
144
+ data = 'Some Test Data'
145
+ message = WMQ::Message.new
146
+ message.data = data
147
+ message.descriptor[:format] = format
148
+ message.headers = headers
149
+ #assert_equal(true,@queue_manager.put(:q_name=>@in_queue.name, :message=>message))
150
+ assert_equal(true,@out_queue.put(:message=>message))
151
+
152
+ message = WMQ::Message.new
153
+ assert_equal(true, @in_queue.get(:message=>message))
154
+ assert_equal(data, message.data)
155
+ assert_equal(headers.size, message.headers.size)
156
+ count = 0
157
+ headers.each do |header|
158
+ reply_header = message.headers[count]
159
+ header.each_pair{|key, value| assert_equal(value, reply_header[key])}
160
+ count = count + 1
161
+ end
162
+ end
163
+
164
+ def test_dlh
165
+ puts '****** test_dlh ******'
166
+ dlh = {:header_type =>:dead_letter_header,
167
+ :reason => WMQ::MQRC_UNKNOWN_REMOTE_Q_MGR,
168
+ :dest_q_name =>'ORIGINAL_QUEUE_NAME',
169
+ :dest_q_mgr_name =>'BAD_Q_MGR',
170
+ :put_appl_name =>'TestApp.exe',
171
+ }
172
+
173
+ verify_header(dlh, WMQ::MQFMT_DEAD_LETTER_HEADER)
174
+ # Untested keys:
175
+ #:put_date=>"",
176
+ #:put_time=>"",
177
+ #:encoding=>0,
178
+ #:coded_char_set_id=>437,
179
+ #:put_appl_type=>0,
180
+
181
+ # Test again, but use QueueManager#put this time
182
+ data = 'Some Test Data'
183
+ message = WMQ::Message.new
184
+ message.data = data
185
+ message.descriptor[:format] = WMQ::MQFMT_STRING
186
+ message.headers << dlh
187
+ assert_equal(true,@queue_manager.put(:q_name=>@in_queue.name, :message=>message))
188
+
189
+ message = WMQ::Message.new
190
+ assert_equal(true, @in_queue.get(:message=>message))
191
+ assert_equal(data, message.data)
192
+ assert_equal(1, message.headers.size)
193
+ reply_header = message.headers[0]
194
+
195
+ dlh.each_pair{|key, value| assert_equal(value, reply_header[key])}
196
+ end
197
+
198
+ def test_cics
199
+ puts '****** test_cics ******'
200
+ cics = {:header_type =>:cics,
201
+ :reason =>WMQ::MQRC_UNKNOWN_REMOTE_Q_MGR,
202
+ :facility =>'TOKEN123',
203
+ :reply_to_format =>WMQ::MQFMT_STRING,
204
+ }
205
+ verify_header(cics, WMQ::MQFMT_NONE)
206
+ end
207
+
208
+ def test_ims
209
+ puts '****** test_ims ******'
210
+ ims = {:header_type =>:ims,
211
+ :l_term_override =>'LTERM',
212
+ :reply_to_format =>WMQ::MQFMT_STRING,
213
+ }
214
+ verify_header(ims, WMQ::MQFMT_STRING)
215
+ end
216
+
217
+ def test_transmission_header
218
+ puts '****** test_transmission_header ******'
219
+ xqh = {:header_type =>:xmit_q_header,
220
+ :remote_q_name =>'SOME_REMOTE_QUEUE',
221
+ :remote_q_mgr_name=>'SOME_REMOTE_Q_MGR',
222
+ :msg_type =>WMQ::MQMT_REQUEST,
223
+ :msg_id =>'my message Id',
224
+ }
225
+ verify_header(xqh, WMQ::MQFMT_STRING)
226
+ end
227
+
228
+ def test_rf_header
229
+ puts '****** test_rf_header ******'
230
+ rfh = {:header_type =>:rf_header,
231
+ :name_value => {' name s' => ' v a "l" u e 1 ',
232
+ 'n a m e 2 ' => 'v a l u e 2',
233
+ '' => ['"', '""', '"""', '""""', ''],
234
+ 'name3'=>['"value3"', '', '"',' value 43"']},
235
+ }
236
+ verify_header(rfh, WMQ::MQFMT_STRING)
237
+ end
238
+
239
+ def test_rf_header_2
240
+ puts '****** test_rf_header_2 ******'
241
+ rfh2 = {:header_type =>:rf_header_2,
242
+ :xml => ['<hello>to the world</hello>',
243
+ '<another>xml like string</another>'],
244
+ }
245
+ verify_header(rfh2, WMQ::MQFMT_STRING)
246
+ end
247
+
248
+ def test_multiple_headers
249
+ puts '****** test_multiple_headers ******'
250
+ headers = [{:header_type => :rf_header_2,
251
+ :xml => ['<hello>to the world</hello>',
252
+ '<another>xml like string</another>'],},
253
+
254
+ {:header_type => :rf_header,
255
+ :name_value => {' name s' => ' v a l u e 1 ',
256
+ 'n a m e 2 ' => 'v a l u e 2',
257
+ 'name3'=>['value3', '', 'value 43']} },
258
+
259
+ {:header_type => :ims,
260
+ :l_term_override => 'LTERM',
261
+ :reply_to_format => WMQ::MQFMT_STRING},
262
+
263
+ {:header_type => :rf_header,
264
+ :name_value => {' name s' => ' v a l u e 1 ',
265
+ 'n a m e 2 ' => 'v a l u e 2',
266
+ 'name3'=>['value3', '', 'value 43']} },
267
+
268
+ {:header_type => :cics,
269
+ :reason => WMQ::MQRC_UNKNOWN_REMOTE_Q_MGR,
270
+ :facility => 'TOKEN123',
271
+ :reply_to_format => WMQ::MQFMT_STRING},
272
+
273
+ {:header_type => :rf_header_2,
274
+ :xml => ['<hello>to the world</hello>', '<another>xml like string</another>'],},
275
+
276
+ {:header_type => :xmit_q_header,
277
+ :remote_q_name => 'SOME_REMOTE_QUEUE',
278
+ :remote_q_mgr_name=> 'SOME_REMOTE_Q_MGR',
279
+ :msg_type => WMQ::MQMT_REQUEST,
280
+ :msg_id => 'my message Id'},
281
+ ]
282
+ verify_multiple_headers(headers, WMQ::MQFMT_STRING)
283
+ end
284
+
285
+ def test_xmit_multiple_headers
286
+ puts '****** test_xmit_q_header with ims header ******'
287
+ headers = [{:header_type => :xmit_q_header,
288
+ :remote_q_name => 'SOME_REMOTE_QUEUE',
289
+ :remote_q_mgr_name=> 'SOME_REMOTE_Q_MGR',
290
+ :msg_type => WMQ::MQMT_REQUEST,
291
+ :msg_id => 'my message Id'},
292
+
293
+ {:header_type => :ims,
294
+ :l_term_override => 'LTERM',
295
+ :reply_to_format => WMQ::MQFMT_STRING},
296
+ ]
297
+ verify_multiple_headers(headers, WMQ::MQFMT_STRING)
298
+ end
299
+
300
+ def test_message_grouping
301
+ puts '****** test_message_grouping ******'
302
+ # Clear out queue of any messages
303
+ @in_queue.each { |message| }
304
+
305
+ msg = WMQ::Message.new
306
+ msg.data = 'First'
307
+ msg.descriptor[:msg_flags] = WMQ::MQMF_MSG_IN_GROUP
308
+ assert_equal(@out_queue.put(:message=>msg, :options => WMQ::MQPMO_LOGICAL_ORDER), true)
309
+
310
+ msg.data = 'Second'
311
+ assert_equal(@out_queue.put(:message=>msg, :options => WMQ::MQPMO_LOGICAL_ORDER), true)
312
+
313
+ msg.data = 'Last'
314
+ msg.descriptor[:msg_flags] = WMQ::MQMF_LAST_MSG_IN_GROUP
315
+ assert_equal(@out_queue.put(:message=>msg, :options => WMQ::MQPMO_LOGICAL_ORDER), true)
316
+ end
317
+
318
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ekaranto-rubywmq
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Reid Morrison
9
+ - Edwin Fine
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-05-10 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: shoulda
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ description: RubyWMQ is a high performance native Ruby interface into WebSphere MQ.
32
+ email:
33
+ - reidmo@gmail.com
34
+ executables: []
35
+ extensions:
36
+ - ext/extconf.rb
37
+ extra_rdoc_files: []
38
+ files:
39
+ - LICENSE.txt
40
+ - README.md
41
+ - Rakefile
42
+ - examples/each_a.rb
43
+ - examples/each_b.rb
44
+ - examples/each_header.rb
45
+ - examples/files_to_q.cfg
46
+ - examples/files_to_q.rb
47
+ - examples/get_a.rb
48
+ - examples/get_client.rb
49
+ - examples/put1_a.rb
50
+ - examples/put1_b.rb
51
+ - examples/put1_c.rb
52
+ - examples/put_a.rb
53
+ - examples/put_b.rb
54
+ - examples/put_dlh.rb
55
+ - examples/put_dynamic_q.rb
56
+ - examples/put_group_a.rb
57
+ - examples/put_group_b.rb
58
+ - examples/put_rfh.rb
59
+ - examples/put_rfh2_a.rb
60
+ - examples/put_rfh2_b.rb
61
+ - examples/put_xmit_q.rb
62
+ - examples/q_to_files.cfg
63
+ - examples/q_to_files.rb
64
+ - examples/request.rb
65
+ - examples/server.rb
66
+ - ext/decode_rfh.c
67
+ - ext/decode_rfh.h
68
+ - ext/extconf.rb
69
+ - ext/extconf_client.rb
70
+ - ext/generate/generate_const.rb
71
+ - ext/generate/generate_reason.rb
72
+ - ext/generate/generate_structs.rb
73
+ - ext/generate/wmq_structs.erb
74
+ - ext/wmq.c
75
+ - ext/wmq.h
76
+ - ext/wmq_message.c
77
+ - ext/wmq_mq_load.c
78
+ - ext/wmq_queue.c
79
+ - ext/wmq_queue_manager.c
80
+ - lib/rubywmq.rb
81
+ - lib/wmq.rb
82
+ - lib/wmq/message.rb
83
+ - lib/wmq/queue_manager.rb
84
+ - lib/wmq/version.rb
85
+ - nbproject/project.properties
86
+ - nbproject/project.xml
87
+ - tests/test.rb
88
+ - .document
89
+ homepage: https://github.com/reidmorrison/rubywmq
90
+ licenses: []
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: 1.8.4
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ! '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ requirements:
108
+ - WebSphere MQ v5.3, v6 or v7 Client or Server with Development Kit
109
+ rubyforge_project: rubywmq
110
+ rubygems_version: 1.8.25
111
+ signing_key:
112
+ specification_version: 3
113
+ summary: Native Ruby interface into WebSphere MQ
114
+ test_files:
115
+ - tests/test.rb