rmq 0.0.1

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/lib/rmq/queue.rb ADDED
@@ -0,0 +1,36 @@
1
+ module RMQ
2
+ class Queue
3
+ include MQClient
4
+
5
+ # TODO add some caching for the queue handle
6
+
7
+ def initialize(queue_manager, name)
8
+ @queue_manager = queue_manager
9
+ @queue_name = name
10
+ end
11
+
12
+ def put_message(payload)
13
+ @queue_handle = open_queue(@queue_manager.connection_handle, @queue_name, Constants::MQOO_OUTPUT) if @queue_handle.nil?
14
+
15
+ put_message_on_queue(@queue_manager.connection_handle, @queue_handle, payload)
16
+
17
+ close_queue(@queue_manager.connection_handle, @queue_handle, Constants::MQCO_NONE)
18
+ @queue_handle = nil
19
+ end
20
+
21
+ def depth
22
+ queue_depth(@queue_manager.connection_handle, @queue_name)
23
+ end
24
+
25
+ def get_message
26
+ @queue_handle = open_queue(@queue_manager.connection_handle, @queue_name, Constants::MQOO_INPUT_SHARED) if @queue_handle.nil?
27
+
28
+ payload = get_message_from_queue(@queue_manager.connection_handle, @queue_handle)
29
+
30
+ close_queue(@queue_manager.connection_handle, @queue_handle, Constants::MQCO_NONE)
31
+ @queue_handle = nil
32
+
33
+ payload
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,105 @@
1
+ require 'rmq/mqclient'
2
+
3
+ module RMQ
4
+ class QueueManager
5
+ include MQClient
6
+ include Constants
7
+
8
+ attr_reader :connection_handle
9
+
10
+ def self.connect(queue_manager)
11
+ qm = QueueManager.new(queue_manager)
12
+ qm.connect
13
+
14
+ qm
15
+ end
16
+
17
+ def initialize(queue_manager)
18
+ @queue_manager = queue_manager
19
+ end
20
+
21
+ def connect
22
+ hconn_ptr = FFI::MemoryPointer.new :long
23
+ completion_code_ptr = FFI::MemoryPointer.new :long
24
+ reason_code_ptr = FFI::MemoryPointer.new :long
25
+
26
+ MQClient.mqconn(@queue_manager, hconn_ptr, completion_code_ptr, reason_code_ptr)
27
+
28
+ @connection_handle = hconn_ptr.read_long
29
+
30
+ unless completion_code_ptr.read_long == MQCC_OK
31
+ raise RMQException.new(completion_code_ptr.read_long, reason_code_ptr.read_long), "Cannot connect to queue manager #{@queue_manager}"
32
+ end
33
+ end
34
+
35
+ def disconnect
36
+ completion_code_ptr = FFI::MemoryPointer.new :long
37
+ reason_code_ptr = FFI::MemoryPointer.new :long
38
+ hconn_ptr = FFI::MemoryPointer.new :long
39
+
40
+ hconn_ptr.write_long @connection_handle
41
+ MQClient.mqdisc(hconn_ptr, completion_code_ptr, reason_code_ptr)
42
+
43
+ unless completion_code_ptr.read_long == MQCC_OK
44
+ raise RMQException.new(completion_code_ptr.read_long, reason_code_ptr.read_long), "Cannot disconnect from queue manager #{@queue_manager}"
45
+ end
46
+ end
47
+
48
+ def find_queue(queue_name)
49
+ queue_names = []
50
+
51
+ adminbag_handle = create_admin_bag
52
+ responsebag_handle = create_response_bag
53
+ add_string_to_bag(adminbag_handle, MQCA_Q_NAME, "*")
54
+ add_integer_to_bag(adminbag_handle, MQIA_Q_TYPE, MQQT_LOCAL)
55
+ add_inquiry(adminbag_handle, MQIA_CURRENT_Q_DEPTH)
56
+
57
+ execute(@connection_handle, MQCMD_INQUIRE_Q, MQHB_NONE, adminbag_handle, responsebag_handle, MQHO_NONE, MQHO_NONE)
58
+
59
+ number_of_bags = count_items(responsebag_handle, MQHA_BAG_HANDLE)
60
+
61
+ for bag_number in (0..number_of_bags - 1)
62
+ attributes_bag_handle = inquire_bag(responsebag_handle, MQHA_BAG_HANDLE, bag_number)
63
+ queue_names.push inquire_string(attributes_bag_handle, MQCA_Q_NAME, 0)
64
+ end
65
+
66
+ delete_bag(adminbag_handle)
67
+ delete_bag(responsebag_handle)
68
+
69
+ if queue_names.include?(queue_name)
70
+ RMQ::Queue.new(self, queue_name)
71
+ else
72
+ nil
73
+ end
74
+ end
75
+
76
+ def create_queue(queue_name)
77
+ adminbag_handle = create_admin_bag
78
+ responsebag_handle = create_response_bag
79
+ add_string_to_bag(adminbag_handle, MQCA_Q_NAME, queue_name)
80
+ add_integer_to_bag(adminbag_handle, MQIA_Q_TYPE, MQQT_LOCAL)
81
+ execute(@connection_handle, MQCMD_CREATE_Q, MQHB_NONE, adminbag_handle, responsebag_handle, MQHO_NONE, MQHO_NONE)
82
+
83
+ delete_bag(adminbag_handle)
84
+ delete_bag(responsebag_handle)
85
+
86
+ RMQ::Queue.new(self, queue_name)
87
+ end
88
+
89
+ def delete_queue(queue_name, purge = true)
90
+ adminbag_handle = create_admin_bag
91
+ responsebag_handle = create_response_bag
92
+ add_string_to_bag(adminbag_handle, MQCA_Q_NAME, queue_name)
93
+
94
+ if purge # delete queue regardless of messages in it
95
+ add_integer_to_bag(adminbag_handle, MQIACF_PURGE, MQPO_YES)
96
+ end
97
+
98
+ execute(@connection_handle, MQCMD_DELETE_Q, MQHB_NONE, adminbag_handle, responsebag_handle, MQHO_NONE, MQHO_NONE)
99
+
100
+ delete_bag(adminbag_handle)
101
+ delete_bag(responsebag_handle)
102
+ end
103
+
104
+ end
105
+ end
@@ -0,0 +1,3 @@
1
+ module RMQ
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe RMQ::QueueManager do
4
+
5
+ after(:each) do
6
+ @qm.disconnect if !@qm.nil?
7
+ end
8
+
9
+ it 'should pass the canary test' do
10
+ true.should == true
11
+ end
12
+
13
+ it 'should connect/disconnect to/from local queue manager' do
14
+ @qm = RMQ::QueueManager::connect(SpecHelper::DATA[:queue_manager])
15
+ @qm.should_not be_nil
16
+ end
17
+
18
+ it "should raise an exception for a wrong queue manager name" do
19
+ lambda { RMQ::QueueManager::connect("INVALID_NAME") }.should raise_error(RMQ::RMQException)
20
+ end
21
+
22
+ it "should create a new queue" do
23
+ @qm = RMQ::QueueManager::connect(SpecHelper::DATA[:queue_manager])
24
+ queue = @qm.create_queue("RMQ.SAMPLE")
25
+ queue.should_not be_nil
26
+
27
+ @qm.find_queue("RMQ.SAMPLE").should_not be_nil
28
+
29
+ @qm.delete_queue("RMQ.SAMPLE")
30
+ end
31
+
32
+ it "should find an existing queue" do
33
+ @qm = RMQ::QueueManager::connect(SpecHelper::DATA[:queue_manager])
34
+ @qm.find_queue("SYSTEM.ADMIN.COMMAND.QUEUE").should_not be_nil # SAMPLE_IN needs to be changed to one that always exists
35
+ end
36
+
37
+ it "should not find a non-existing queue" do
38
+ @qm = RMQ::QueueManager::connect(SpecHelper::DATA[:queue_manager])
39
+ @qm.find_queue("DOES_NOT_EXIST").should be_nil
40
+ end
41
+
42
+ it "should delete a queue" do
43
+ @qm = RMQ::QueueManager::connect(SpecHelper::DATA[:queue_manager])
44
+ @qm.create_queue("RMQ.SAMPLE")
45
+ @qm.find_queue("RMQ.SAMPLE").should_not be_nil
46
+
47
+ @qm.delete_queue("RMQ.SAMPLE")
48
+ @qm.find_queue("RMQ.SAMPLE").should be_nil
49
+ end
50
+
51
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe RMQ::Queue do
4
+
5
+ before(:each) do
6
+ @qm = RMQ::QueueManager::connect(SpecHelper::DATA[:queue_manager])
7
+
8
+ @qm.delete_queue("RMQ.SAMPLE") unless @qm.find_queue("RMQ.SAMPLE").nil?
9
+ @queue = @qm.create_queue("RMQ.SAMPLE")
10
+ end
11
+
12
+ after(:each) do
13
+ @qm.delete_queue("RMQ.SAMPLE")
14
+ @qm.disconnect if !@qm.nil?
15
+ end
16
+
17
+ it "should put a message on a queue" do
18
+ @queue.put_message("sample message")
19
+ @queue.depth.should == 1
20
+ end
21
+
22
+ it "should read a message from a queue" do
23
+ @queue.put_message("I want to read this back")
24
+ @queue.get_message.should == "I want to read this back"
25
+ end
26
+
27
+ end
@@ -0,0 +1,15 @@
1
+ require 'rspec'
2
+ require 'rmq'
3
+
4
+ ENV['MQSERVER'] = "SYSTEM.DEF.SVRCONN/TCP/127.0.0.1(1414)"
5
+
6
+ module SpecHelper
7
+ DATA = {
8
+ :queue_manager => "BKR_QMGR"
9
+ }
10
+ end
11
+
12
+ RSpec.configure do |config|
13
+ config.color_enabled = true
14
+ config.formatter = 'documentation'
15
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rmq
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Stephan Schwab
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &22418904 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '2.7'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *22418904
25
+ description: Ruby wrapper around MQ series client library
26
+ email: sns@caimito.net
27
+ executables: []
28
+ extensions: []
29
+ extra_rdoc_files: []
30
+ files:
31
+ - lib/rmq/constants.rb
32
+ - lib/rmq/exceptions.rb
33
+ - lib/rmq/get_message_options.rb
34
+ - lib/rmq/message_descriptor.rb
35
+ - lib/rmq/mqclient.rb
36
+ - lib/rmq/object_descriptor.rb
37
+ - lib/rmq/put_message_options.rb
38
+ - lib/rmq/queue.rb
39
+ - lib/rmq/queue_manager.rb
40
+ - lib/rmq/version.rb
41
+ - lib/rmq.rb
42
+ - spec/rmq/queue_manager_spec.rb
43
+ - spec/rmq/queue_spec.rb
44
+ - spec/spec_helper.rb
45
+ homepage: http://rubygems.org/gems/rmq
46
+ licenses: []
47
+ post_install_message:
48
+ rdoc_options: []
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ requirements: []
64
+ rubyforge_project:
65
+ rubygems_version: 1.8.11
66
+ signing_key:
67
+ specification_version: 3
68
+ summary: Ruby MQ client wrapper
69
+ test_files:
70
+ - spec/rmq/queue_manager_spec.rb
71
+ - spec/rmq/queue_spec.rb
72
+ - spec/spec_helper.rb