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.rb +12 -0
- data/lib/rmq/constants.rb +1494 -0
- data/lib/rmq/exceptions.rb +17 -0
- data/lib/rmq/get_message_options.rb +55 -0
- data/lib/rmq/message_descriptor.rb +43 -0
- data/lib/rmq/mqclient.rb +282 -0
- data/lib/rmq/object_descriptor.rb +41 -0
- data/lib/rmq/put_message_options.rb +31 -0
- data/lib/rmq/queue.rb +36 -0
- data/lib/rmq/queue_manager.rb +105 -0
- data/lib/rmq/version.rb +3 -0
- data/spec/rmq/queue_manager_spec.rb +51 -0
- data/spec/rmq/queue_spec.rb +27 -0
- data/spec/spec_helper.rb +15 -0
- metadata +72 -0
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
|
data/lib/rmq/version.rb
ADDED
@@ -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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|