ferocia-rubywmq 1.1.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 (50) hide show
  1. data/.document +8 -0
  2. data/LICENSE +13 -0
  3. data/Manifest.txt +20 -0
  4. data/README +73 -0
  5. data/examples/each_a.rb +32 -0
  6. data/examples/each_b.rb +41 -0
  7. data/examples/each_header.rb +38 -0
  8. data/examples/files_to_q.cfg +24 -0
  9. data/examples/files_to_q.rb +47 -0
  10. data/examples/get_a.rb +35 -0
  11. data/examples/get_client.rb +51 -0
  12. data/examples/put1_a.rb +25 -0
  13. data/examples/put1_b.rb +33 -0
  14. data/examples/put1_c.rb +32 -0
  15. data/examples/put_a.rb +35 -0
  16. data/examples/put_b.rb +43 -0
  17. data/examples/put_dlh.rb +41 -0
  18. data/examples/put_dynamic_q.rb +38 -0
  19. data/examples/put_group_a.rb +51 -0
  20. data/examples/put_group_b.rb +53 -0
  21. data/examples/put_rfh.rb +67 -0
  22. data/examples/put_rfh2_a.rb +43 -0
  23. data/examples/put_rfh2_b.rb +43 -0
  24. data/examples/put_xmit_q.rb +33 -0
  25. data/examples/q_to_files.cfg +17 -0
  26. data/examples/q_to_files.rb +48 -0
  27. data/examples/request.rb +60 -0
  28. data/examples/server.rb +97 -0
  29. data/ext/build.bat +3 -0
  30. data/ext/build.sh +6 -0
  31. data/ext/decode_rfh.c +348 -0
  32. data/ext/decode_rfh.h +45 -0
  33. data/ext/extconf.rb +44 -0
  34. data/ext/extconf_client.rb +40 -0
  35. data/ext/generate/generate_const.rb +167 -0
  36. data/ext/generate/generate_reason.rb +246 -0
  37. data/ext/generate/generate_structs.rb +97 -0
  38. data/ext/generate/wmq_structs.erb +371 -0
  39. data/ext/lib/wmq_temp.rb +197 -0
  40. data/ext/wmq.c +93 -0
  41. data/ext/wmq.h +367 -0
  42. data/ext/wmq_message.c +671 -0
  43. data/ext/wmq_mq_load.c +217 -0
  44. data/ext/wmq_queue.c +1411 -0
  45. data/ext/wmq_queue_manager.c +1587 -0
  46. data/lib/wmq.rb +25 -0
  47. data/rubywmq.binary.gemspec +32 -0
  48. data/rubywmq.gemspec +33 -0
  49. data/tests/test.rb +328 -0
  50. metadata +124 -0
@@ -0,0 +1,51 @@
1
+ ################################################################################
2
+ # Copyright 2006 J. Reid Morrison. Dimension Solutions, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ ################################################################################
16
+
17
+ #
18
+ # Sample : put() : Put multiple Messages to a queue under the same group Id
19
+ # Open the queue so that multiple puts can be performed
20
+ # Ensure that all messages have the same group id
21
+ # Allow MQ to create the unique group id and let it automatically
22
+ # assign message sequence numbers for each message in the group
23
+ #
24
+ require 'rubygems'
25
+ require 'wmq/wmq'
26
+
27
+ # Put 5 messages in a single group onto the queue
28
+ total = 5
29
+
30
+ WMQ::QueueManager.connect(:q_mgr_name=>'REID') do |qmgr|
31
+ qmgr.open_queue(:q_name=>'TEST.QUEUE', :mode=>:output) do |queue|
32
+ message = WMQ::Message.new
33
+ total.times do |count|
34
+ message.data = "Hello:#{count}"
35
+
36
+ # Set the message flag to indicate message is in a group
37
+ # On the last message, set the last message flag
38
+ message.descriptor[:msg_flags] = (count < total-1) ? WMQ::MQMF_MSG_IN_GROUP : WMQ::MQMF_LAST_MSG_IN_GROUP
39
+
40
+ # new_id => true causes subsequent messages to have unique message and
41
+ # correlation id's. Otherwise all messages will have the same message and
42
+ # correlation id's since the same message object is being
43
+ # re-used for all put calls.
44
+ #
45
+ # By setting the put :options => WMQ::MQPMO_LOGICAL_ORDER then MQ will supply a unique Group Id
46
+ # and MQ will automatically set the message sequence number for us.
47
+ queue.put(:message => message, :new_id => true, :options => WMQ::MQPMO_LOGICAL_ORDER)
48
+ p message.descriptor
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,53 @@
1
+ ################################################################################
2
+ # Copyright 2006 J. Reid Morrison. Dimension Solutions, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ ################################################################################
16
+
17
+ #
18
+ # Sample : put() : Put multiple Messages to a queue under the same group Id
19
+ # Open the queue so that multiple puts can be performed
20
+ # Ensure that all messages have the same group id
21
+ # Supply our own user-defined group Id.
22
+ # We also have to supply the message sequence number which starts at 1
23
+ #
24
+ require 'rubygems'
25
+ require 'wmq/wmq'
26
+
27
+ # Put 5 messages in a single group onto the queue
28
+ total = 5
29
+
30
+ WMQ::QueueManager.connect(:q_mgr_name=>'REID') do |qmgr|
31
+ qmgr.open_queue(:q_name=>'TEST.QUEUE', :mode=>:output) do |queue|
32
+ message = WMQ::Message.new
33
+ # Supply a unique Group Id, truncated to the MQ maximum for Group Id.
34
+ message.descriptor[:group_id] = 'MyUniqueGroupId'
35
+ total.times do |count|
36
+ # new_id => true causes subsequent messages to have unique message and
37
+ # correlation id's. Otherwise all messages will have the same message and
38
+ # correlation id's since the same message object is being
39
+ # re-used for all put calls
40
+ message.data = "Hello:#{count}"
41
+
42
+ # Set the message flag to indicate message is in a group
43
+ # On the last message, set the last message flag
44
+ message.descriptor[:msg_flags] = (count < total-1) ? WMQ::MQMF_MSG_IN_GROUP : WMQ::MQMF_LAST_MSG_IN_GROUP
45
+ message.descriptor[:msg_seq_number] = count + 1
46
+
47
+ # By setting the put :options => WMQ::MQPMO_LOGICAL_ORDER then MQ will supply a unique Group Id
48
+ # and MQ will automatically set the message sequence number for us.
49
+ queue.put(:message => message, :new_id => true)
50
+ p message.descriptor
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,67 @@
1
+ ################################################################################
2
+ # Copyright 2006 J. Reid Morrison. Dimension Solutions, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ ################################################################################
16
+
17
+ #
18
+ # Sample : put() : Put a message to a queue with a Refernce header
19
+ # Open the queue so that multiple puts can be performed
20
+ #
21
+ require 'rubygems'
22
+ require 'wmq/wmq'
23
+
24
+ # The Rules Format header (MQRFH) allows a list of name value pairs to be sent along
25
+ # with a WMQ message. These name value pairs are represented as follows on the "wire":
26
+ # Name1 Value1 Name2 Value2 Name3 Value3
27
+ #
28
+ # Ruby WMQ converts the above string of data into a Ruby hash by
29
+ # using the name as the key, as follows:
30
+ # data = {
31
+ # 'Name1' => 'Value1',
32
+ # 'Name2' => 'Value2',
33
+ # 'Name3' => 'Value3'
34
+ # }
35
+ #
36
+ # Since a name can consist of any character except null, it is stored as a String
37
+ #
38
+ # Note: It is possible to send or receive the same Name with multiple values using an array.
39
+ # E.g. Name1 Value1 Name2 Value2 Name1 Value3
40
+ # Becomes:
41
+ # data = {
42
+ # 'Name1' => ['Value1', 'Value3'],
43
+ # 'Name2' => 'Value2'
44
+ # }
45
+ #
46
+ # Note: Since a Hash does not preserve order, reading a Rules Format Header and then writing
47
+ # it out immediately again could result in re-ordering of the name value pairs.
48
+ #
49
+
50
+ WMQ::QueueManager.connect(:q_mgr_name=>'REID') do |qmgr|
51
+ qmgr.open_queue(:q_name=>'TEST.QUEUE', :mode=>:output) do |queue|
52
+ message = WMQ::Message.new
53
+ message.data = 'Hello World'
54
+
55
+ message.headers = [
56
+ {:header_type =>:rf_header,
57
+ :name_value => {'name1' => 'value1',
58
+ 'name2' => 'value2',
59
+ 'name3' => ['value 3a', 'value 3b']}
60
+ }]
61
+
62
+ message.descriptor[:format] = WMQ::MQFMT_STRING
63
+
64
+ queue.put(:message=>message)
65
+ end
66
+ end
67
+
@@ -0,0 +1,43 @@
1
+ ################################################################################
2
+ # Copyright 2006 J. Reid Morrison. Dimension Solutions, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ ################################################################################
16
+
17
+ #
18
+ # Sample : put() : Put a message to a queue with a Refernce header
19
+ # Open the queue so that multiple puts can be performed
20
+ #
21
+ require 'rubygems'
22
+ require 'wmq/wmq'
23
+
24
+ # The Rules Format header2 (MQRFH2) allows a an XML-like string to be passed as a header
25
+ # to the data.
26
+ #
27
+
28
+ WMQ::QueueManager.connect(:q_mgr_name=>'REID') do |qmgr|
29
+ qmgr.open_queue(:q_name=>'TEST.QUEUE', :mode=>:output) do |queue|
30
+ message = WMQ::Message.new
31
+ message.data = 'Hello World'
32
+
33
+ message.headers = [
34
+ {:header_type =>:rf_header_2,
35
+ :xml => '<hello>to the world</hello>'
36
+ }]
37
+
38
+ message.descriptor[:format] = WMQ::MQFMT_STRING
39
+
40
+ queue.put(:message=>message)
41
+ end
42
+ end
43
+
@@ -0,0 +1,43 @@
1
+ ################################################################################
2
+ # Copyright 2006 J. Reid Morrison. Dimension Solutions, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ ################################################################################
16
+
17
+ #
18
+ # Sample : put() : Put a message to a queue with a Refernce header
19
+ # Open the queue so that multiple puts can be performed
20
+ #
21
+ require 'rubygems'
22
+ require 'wmq/wmq'
23
+
24
+ # The Rules Format header2 (MQRFH2) allows a an XML-like string to be passed as a header
25
+ # to the data.
26
+ #
27
+
28
+ WMQ::QueueManager.connect(:q_mgr_name=>'REID') do |qmgr|
29
+ qmgr.open_queue(:q_name=>'TEST.QUEUE', :mode=>:output) do |queue|
30
+ message = WMQ::Message.new
31
+ message.data = 'Hello World'
32
+
33
+ message.headers = [
34
+ {:header_type =>:rf_header_2,
35
+ :xml => ['<hello>to the world</hello>', '<another>xml like string</another>'],
36
+ }]
37
+
38
+ message.descriptor[:format] = WMQ::MQFMT_STRING
39
+
40
+ queue.put(:message=>message)
41
+ end
42
+ end
43
+
@@ -0,0 +1,33 @@
1
+ ################################################################################
2
+ # Copyright 2006 J. Reid Morrison. Dimension Solutions, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ ################################################################################
16
+
17
+ #
18
+ # Sample : put() : Put a message to a queue with a Transmission header
19
+ #
20
+ require 'rubygems'
21
+ require 'wmq/wmq'
22
+
23
+ WMQ::QueueManager.connect(:q_mgr_name=>'REID') do |qmgr|
24
+ qmgr.open_queue(:q_name=>'TEST.QUEUE', :mode=>:output) do |queue|
25
+ message = WMQ::Message.new
26
+ message.data = "Test message from 'LOCALQMS1'"
27
+ message.descriptor = {:original_length=>-1, :priority=>0, :put_time=>"18510170", :msg_id=>"AMQ LOCALQMS1 E\233\001\237 \000\003\005", :expiry=>-1, :persistence=>0, :reply_to_q=>"MQMON", :correl_id=>"AMQ LOCALQMS1 E\233\001\237 \000\003\004", :feedback=>0, :offset=>0, :report=>0, :msg_flags=>0, :reply_to_q_mgr=>"LOCALQMS1", :appl_identity_data=>"", :put_appl_name=>"LOCALQMS1", :user_identifier=>"mqm", :msg_seq_number=>1, :appl_origin_data=>"", :accounting_token=>"\026\001\005\025\000\000\000\271U\305\002\261\022\362\321\021D\3206\357\003\000\000\000\000\000\000\000\000\000\000\v", :backout_count=>0, :coded_char_set_id=>437, :put_appl_type=>7, :msg_type=>8, :group_id=>"", :put_date=>"20070109", :format=>"MQSTR", :encoding=>546}
28
+ message.headers = [{:priority=>0, :remote_q_mgr_name=>"OTHER.QMGR", :put_time=>"18510170", :msg_id=>"AMQ LOCALQMS1 E\233\001\237 \000\003\004", :expiry=>-1, :persistence=>0, :remote_q_name=>"OTHER.Q", :header_type=>:xmit_q_header, :reply_to_q=>"MQMON", :correl_id=>"", :feedback=>0, :report=>0, :reply_to_q_mgr=>"LOCALQMS1", :appl_identity_data=>"", :put_appl_name=>"uments\\MQ\\MQMon\\mqmonntp.exe", :user_identifier=>"mqm", :appl_origin_data=>"", :accounting_token=>"\026\001\005\025\000\000\000\271U\305\002\261\022\362\321\021D\3206\357\003\000\000\000\000\000\000\000\000\000\000\v", :backout_count=>0, :coded_char_set_id=>437, :put_appl_type=>11, :msg_type=>8, :put_date=>"20070109", :encoding=>546}]
29
+
30
+ queue.put(:message=>message)
31
+ end
32
+ end
33
+
@@ -0,0 +1,17 @@
1
+ dev:
2
+ qmgr_options:
3
+ :q_mgr_name: REID
4
+ input_queue:
5
+ :mode: :browse
6
+ :q_name: TEST.QUEUE
7
+ target_directory: messages
8
+
9
+ test:
10
+ qmgr_options:
11
+ :q_mgr_name: TEST.QMGR
12
+ :channel_name: SYSTEM.DEF.SVRCONN
13
+ :connection_name: remotehost(1414)
14
+ input_queue:
15
+ :mode: :browse
16
+ :q_name: TEST.QUEUE
17
+ target_directory: messages
@@ -0,0 +1,48 @@
1
+ ################################################################################
2
+ # Copyright 2006 J. Reid Morrison. Dimension Solutions, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ ################################################################################
16
+
17
+ #
18
+ # Example: q_to_files: Copy all messages in a queue to separate files in a directory
19
+ #
20
+ require 'rubygems'
21
+ require 'find'
22
+ require 'yaml'
23
+ require 'wmq/wmq'
24
+ require 'fileutils'
25
+
26
+ # Call program passing environment name as first parameter
27
+ # The environment corresponds to an entry in the config file
28
+ env = ARGV[0] || raise("Command line argument 'environment' is required")
29
+ config = YAML::load_file('q_to_files.cfg')[env]
30
+
31
+ # Create supplied path if it does not exist
32
+ path = config['target_directory']
33
+ FileUtils.mkdir_p(path)
34
+
35
+ message = WMQ::Message.new
36
+ message.descriptor = config['descriptor'] || {}
37
+ tstart = Time.now
38
+ counter = 0
39
+ WMQ::QueueManager.connect(config['qmgr_options']) do |qmgr|
40
+ qmgr.open_queue(config['input_queue']) do |queue|
41
+ queue.each do |message|
42
+ counter = counter + 1
43
+ File.open(File.join(path, "message_%03d" % counter), 'w') {|file| file.write(message.data) }
44
+ end
45
+ end
46
+ end
47
+ duration = Time.now - tstart
48
+ printf "Processed #{counter} messages in %.3f seconds. Average: %.3f messages/second\n", duration, counter/duration
@@ -0,0 +1,60 @@
1
+ ################################################################################
2
+ # Copyright 2006 J. Reid Morrison. Dimension Solutions, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ ################################################################################
16
+
17
+ #
18
+ # Sample : request.rb
19
+ #
20
+ # Sample program that demonstrates how to send a request message
21
+ # and then block until the response is received from the server.
22
+ #
23
+ # A temporary Dynamic Reply To Queue is used with non-persistent messaging
24
+ #
25
+ require 'rubygems'
26
+ require 'wmq'
27
+
28
+ wait_seconds = 30
29
+
30
+ WMQ::QueueManager.connect(:q_mgr_name=>'REID') do |qmgr|
31
+ qmgr.open_queue(:q_name => 'SYSTEM.DEFAULT.MODEL.QUEUE',
32
+ :dynamic_q_name=> 'REQUEST.*',
33
+ :mode => :input
34
+ ) do |reply_queue|
35
+
36
+ message = WMQ::Message.new()
37
+ message.descriptor = { :msg_type => WMQ::MQMT_REQUEST,
38
+ :reply_to_q => reply_queue.name,
39
+ :reply_to_q_mgr=> qmgr.name,
40
+ :format => WMQ::MQFMT_STRING,
41
+ :expiry => wait_seconds*10} # Measured in tenths of a second
42
+ message.data = 'Hello World'
43
+
44
+ # Send request message
45
+ qmgr.put(:q_name=>'TEST.QUEUE', :message=>message)
46
+
47
+ # Copy outgoing Message id to correlation id
48
+ message.descriptor[:correl_id]=message.descriptor[:msg_id]
49
+
50
+ # Wait for reply
51
+ # Only get the message that matches the correlation id set above
52
+ if reply_queue.get(:wait=>wait_seconds*1000, :message=>message, :match=>WMQ::MQMO_MATCH_CORREL_ID)
53
+ puts "Received:"
54
+ puts message.data
55
+ else
56
+ # get returns false when no message received. Also: message.data = nil
57
+ puts "Timed Out waiting for a reply from the server"
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,97 @@
1
+ ################################################################################
2
+ # Copyright 2006 J. Reid Morrison. Dimension Solutions, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ ################################################################################
16
+
17
+ #
18
+ # Sample : Sample program to show how to write a server side application
19
+ #
20
+ # This server times out after 60 seconds, but could be modified to
21
+ # run forever. Example:
22
+ # queue.each(:wait=>-1) do |message|
23
+ #
24
+ # Note: - All calls are being performed under synchpoint control to
25
+ # prevent messages being if the program terminates unexpectedly
26
+ # or an error occurrs.
27
+ # Uses: :sync=>true
28
+ # - Queue#each will backout any message changes if an excecption is raised
29
+ # but not handled within the each block
30
+ #
31
+ # A "well-behaved" WebSphere MQ application should adhere to the following rules:
32
+ # - Perform puts and gets under synchpoint where applicable
33
+ # - Only send replies to Request messages. No reply for Datagrams
34
+ # - Set the message type to Reply when replying to a request message
35
+ # - Reply with:
36
+ # - Remaining Expiry (Ideally deduct any processing time since get)
37
+ # - Same priority as received message
38
+ # - Same persistence as received message
39
+ # - Adhere to the Report options supplied for message and correlation id's
40
+ # in reply message
41
+ # - All headers must be returned on reply messages
42
+ # - This allows the calling application to store state information
43
+ # in these headers
44
+ # - Unless of course if the relevant header is input only and used
45
+ # for completing the request
46
+ # - In this case any remaining headers should be returned
47
+ # to the caller
48
+ # - If an error occurs trying to process the message, an error message
49
+ # must be sent back to the requesting application
50
+ # - If the reply fails, it must be put to the dead letter queue
51
+ # with the relevant dead letter header and reason
52
+ #
53
+ # Note: - It is not recommended to run server side MQ applications over a client
54
+ # connection.
55
+ # - Client connections require substantially more error handling.
56
+ # - E.g. Connection to queue manager can be lost due to netowk issues
57
+ # - Need to go into some sort of retry state attempting
58
+ # to reconnect to the queue manager
59
+ # - What about any work that was in progress?
60
+ # - Need to re-open any queues
61
+ # - Do any changes to other resources need to be undone first?
62
+ # - E.g. Database, File etc..
63
+ # - etc....
64
+ #
65
+ require 'rubygems'
66
+ require 'wmq/wmq'
67
+
68
+ WMQ::QueueManager.connect(:q_mgr_name=>'REID') do |qmgr|
69
+ qmgr.open_queue(:q_name=>'TEST.QUEUE', :mode=>:input) do |queue|
70
+ queue.each(:wait=>60000, :sync=>true, :convert=>true) do |request|
71
+ puts "Data Received:"
72
+ puts request.data
73
+
74
+ begin
75
+ reply = WMQ::Message.new
76
+ reply.data = 'Echo back:'+request.data
77
+
78
+ qmgr.put_to_reply_q(:message=>reply,
79
+ :request_message=>request, # Only replies if message type is request
80
+ :sync=>true)
81
+
82
+ rescue WMQ::WMQException => exc
83
+ # Failed to send reply, put message to the Dead Letter Queue and add a dead letter header
84
+ p exc
85
+ puts "Failed to reply to sender, Put to dead letter queue"
86
+ qmgr.put_to_dead_letter_q(:message=>request,
87
+ :reason=>WMQ::MQRC_UNKNOWN_REMOTE_Q_MGR,
88
+ :q_name=>queue.name,
89
+ :sync=>true)
90
+ # If it fails to put to the dead letter queue, this program will terminate and
91
+ # the changes will be "backed out". E.g. Queue Full, ...
92
+ end
93
+ qmgr.commit
94
+ end
95
+ end
96
+ puts 'No more messages found after 60 second wait interval'
97
+ end
data/ext/build.bat ADDED
@@ -0,0 +1,3 @@
1
+ call "C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT"
2
+ ruby extconf.rb --with-mqm-include="C:\Program Files\IBM\WebSphere MQ\Tools\c\include"
3
+ nmake
data/ext/build.sh ADDED
@@ -0,0 +1,6 @@
1
+ ruby extconf.rb --with-mqm-include=/opt/mqm/inc --with-mqm-lib=/opt/mqm/lib
2
+ make
3
+ # Uncomment the following lines for platforms other than Solaris, Windows and Linux
4
+ #ruby extconf_client.rb --with-mqm-include=/opt/mqm/inc --with-mqm-lib=/opt/mqm/lib
5
+ #make
6
+