rmq 0.0.7 → 0.0.8
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/exceptions.rb +9 -0
- data/lib/rmq/message.rb +5 -0
- data/lib/rmq/message_descriptor.rb +1 -1
- data/lib/rmq/mqclient.rb +26 -20
- data/lib/rmq/queue.rb +34 -16
- data/lib/rmq/version.rb +1 -1
- data/spec/rmq/queue_spec.rb +19 -2
- metadata +5 -5
data/lib/rmq/exceptions.rb
CHANGED
data/lib/rmq/message.rb
CHANGED
data/lib/rmq/mqclient.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
|
1
3
|
module RMQ
|
2
4
|
module MQClient
|
3
5
|
include Constants
|
4
6
|
extend FFI::Library
|
5
7
|
|
6
8
|
def MQClient.running_on_windows?
|
7
|
-
(/cygwin|mswin|mingw|bccwin|wince|emx/ =~
|
9
|
+
(/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RbConfig::CONFIG['host_os']) != nil
|
8
10
|
end
|
9
11
|
|
10
12
|
def MQClient.running_on_linux?
|
11
|
-
|
13
|
+
RbConfig::CONFIG['host_os'].include?("linux")
|
12
14
|
end
|
13
15
|
|
14
16
|
ffi_lib "mqic32.dll" if running_on_windows?
|
@@ -239,6 +241,8 @@ module RMQ
|
|
239
241
|
|
240
242
|
mqput(connection_handle, queue_handle, message_descriptor, message_options, payload.length, payload, completion_code_ptr, reason_code_ptr)
|
241
243
|
raise RMQException.new(completion_code_ptr.read_long, reason_code_ptr.read_long), "Cannot send message" if completion_code_ptr.read_long != MQCC_OK
|
244
|
+
|
245
|
+
message_descriptor[:MsgId]
|
242
246
|
end
|
243
247
|
|
244
248
|
def queue_depth(connection_handle, queue_name)
|
@@ -260,14 +264,13 @@ module RMQ
|
|
260
264
|
queue_depth
|
261
265
|
end
|
262
266
|
|
263
|
-
def get_message_from_queue(connection_handle, queue_handle,
|
264
|
-
puts "--- get message from queue"
|
267
|
+
def get_message_from_queue(connection_handle, queue_handle, options = {})
|
265
268
|
completion_code_ptr = FFI::MemoryPointer.new :long
|
266
269
|
reason_code_ptr = FFI::MemoryPointer.new :long
|
267
270
|
data_length_ptr = FFI::MemoryPointer.new :long
|
268
271
|
|
269
|
-
message_options = prepare_get_message_options(
|
270
|
-
message_descriptor = prepare_get_message_descriptor
|
272
|
+
message_options = prepare_get_message_options(false, options)
|
273
|
+
message_descriptor = prepare_get_message_descriptor(options)
|
271
274
|
|
272
275
|
data_length = 8 * 1024
|
273
276
|
buffer_ptr = FFI::MemoryPointer.new :char, data_length
|
@@ -285,12 +288,21 @@ module RMQ
|
|
285
288
|
raise RMQException.new(completion_code_ptr.read_long, reason_code_ptr.read_long), "Cannot learn message length" unless completion_code_ptr.read_long == MQCC_OK
|
286
289
|
end
|
287
290
|
|
288
|
-
Message.new(buffer_ptr.read_string, message_descriptor)
|
291
|
+
RMQ::Message.new(buffer_ptr.read_string, message_descriptor)
|
292
|
+
end
|
293
|
+
|
294
|
+
def print_msg_id(msg_id)
|
295
|
+
hex_string = ''
|
296
|
+
for i in (0..MQClient::MessageDescriptor::MSG_ID_LENGTH-1) do
|
297
|
+
hex_string << "0x#{msg_id[i].to_s(16)}"
|
298
|
+
hex_string << ", " if i < MQClient::MessageDescriptor::MSG_ID_LENGTH-1
|
299
|
+
end
|
300
|
+
hex_string
|
289
301
|
end
|
290
302
|
|
291
303
|
private
|
292
304
|
|
293
|
-
def prepare_get_message_options(
|
305
|
+
def prepare_get_message_options(accept_truncated_msg, options = {})
|
294
306
|
message_options = GetMessageOptions.new
|
295
307
|
message_options[:StrucId] = GetMessageOptions::MQGMO_STRUC_ID
|
296
308
|
message_options[:Version] = GetMessageOptions::MQGMO_VERSION_1
|
@@ -300,29 +312,23 @@ module RMQ
|
|
300
312
|
message_options[:Options] = GetMessageOptions::MQGMO_ACCEPT_TRUNCATED_MSG | message_options[:Options]
|
301
313
|
end
|
302
314
|
|
303
|
-
if timeout
|
315
|
+
if options.has_key?(:timeout)
|
304
316
|
message_options[:Options] = GetMessageOptions::MQGMO_WAIT | message_options[:Options]
|
305
|
-
message_options[:WaitInterval] = timeout * 1000
|
317
|
+
message_options[:WaitInterval] = options[:timeout] * 1000
|
306
318
|
end
|
307
319
|
|
308
320
|
message_options
|
309
321
|
end
|
310
322
|
|
311
|
-
def
|
312
|
-
puts "printing msg id"
|
313
|
-
for i in (0..MQClient::MessageDescriptor::MSG_ID_LENGTH-1) do
|
314
|
-
puts "#{i} = #{msg_id[i]}"
|
315
|
-
end
|
316
|
-
end
|
317
|
-
|
318
|
-
def prepare_get_message_descriptor(msg_id = nil)
|
323
|
+
def prepare_get_message_descriptor(options)
|
319
324
|
message_descriptor = MQClient::MessageDescriptor.new
|
320
325
|
message_descriptor[:StrucId] = MQClient::MessageDescriptor::MQMD_STRUC_ID
|
321
326
|
message_descriptor[:Version] = MQClient::MessageDescriptor::MQMD_VERSION_1
|
322
327
|
|
323
|
-
if
|
328
|
+
if options.has_key?(:message_id)
|
329
|
+
msg_id = options[:message_id]
|
324
330
|
for i in (0..MQClient::MessageDescriptor::MSG_ID_LENGTH-1) do
|
325
|
-
message_descriptor[:MsgId][i] = msg_id[i]
|
331
|
+
message_descriptor[:MsgId][i] = msg_id[i].nil? ? 0 : msg_id[i]
|
326
332
|
end
|
327
333
|
end
|
328
334
|
|
data/lib/rmq/queue.rb
CHANGED
@@ -13,10 +13,12 @@ module RMQ
|
|
13
13
|
def put_message(payload, reply_queue_name = "")
|
14
14
|
@queue_handle = open_queue(@queue_manager.connection_handle, @queue_name, Constants::MQOO_OUTPUT) if @queue_handle.nil?
|
15
15
|
|
16
|
-
put_message_on_queue(@queue_manager.connection_handle, @queue_handle, payload, reply_queue_name)
|
16
|
+
message_id = put_message_on_queue(@queue_manager.connection_handle, @queue_handle, payload, reply_queue_name)
|
17
17
|
|
18
18
|
close_queue(@queue_manager.connection_handle, @queue_handle, Constants::MQCO_NONE)
|
19
19
|
@queue_handle = nil
|
20
|
+
|
21
|
+
message_id
|
20
22
|
end
|
21
23
|
|
22
24
|
def depth
|
@@ -24,32 +26,48 @@ module RMQ
|
|
24
26
|
end
|
25
27
|
|
26
28
|
# Gets a message from the queue. A timeout period can be specified in seconds.
|
27
|
-
def get_message(
|
29
|
+
def get_message(options = {})
|
28
30
|
@queue_handle = open_queue(@queue_manager.connection_handle, @queue_name, Constants::MQOO_INPUT_SHARED) if @queue_handle.nil?
|
29
31
|
|
30
|
-
|
32
|
+
begin
|
31
33
|
begin_time = Time.now.to_i
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end_time = Time.now.to_i
|
36
|
-
raise RMQTimeOutError.new if end_time - begin_time >= timeout
|
37
|
-
end
|
38
|
-
else
|
39
|
-
message = get_message_from_queue(@queue_manager.connection_handle, @queue_handle, 0)
|
40
|
-
end
|
34
|
+
message = get_message_from_queue(@queue_manager.connection_handle, @queue_handle, options)
|
35
|
+
rescue RMQException
|
36
|
+
end_time = Time.now.to_i
|
41
37
|
|
42
|
-
|
43
|
-
|
38
|
+
raise RMQTimeOutError.new if options.has_key?(:timeout) && (end_time - begin_time >= options[:timeout])
|
39
|
+
ensure
|
40
|
+
close_queue(@queue_manager.connection_handle, @queue_handle, Constants::MQCO_NONE)
|
41
|
+
@queue_handle = nil
|
42
|
+
end
|
44
43
|
|
45
44
|
message
|
46
45
|
end
|
47
46
|
|
48
47
|
# Gets a message from the queue and returns the payload only. A timeout period can be specified
|
49
48
|
# in seconds.
|
50
|
-
def get_message_payload(
|
51
|
-
message = get_message(
|
49
|
+
def get_message_payload(options = {})
|
50
|
+
message = get_message(options)
|
52
51
|
message.payload
|
53
52
|
end
|
53
|
+
|
54
|
+
def find_message_by_id(message_id, options = {})
|
55
|
+
message = get_message(options.merge({:message_id => message_id}))
|
56
|
+
|
57
|
+
if (message && compare_message_id(message_id, message.message_id))
|
58
|
+
return message
|
59
|
+
else
|
60
|
+
raise RMQMessageNotFoundException.new(message_id)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def compare_message_id(id1, id2)
|
67
|
+
for i in (0..MQClient::MessageDescriptor::MSG_ID_LENGTH-1) do
|
68
|
+
return false unless id1[i] == id2[i]
|
69
|
+
end
|
70
|
+
true
|
71
|
+
end
|
54
72
|
end
|
55
73
|
end
|
data/lib/rmq/version.rb
CHANGED
data/spec/rmq/queue_spec.rb
CHANGED
@@ -37,11 +37,28 @@ describe RMQ::Queue do
|
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should time out waiting for a message" do
|
40
|
-
lambda { @queue.get_message(2) }.should raise_error(RMQ::RMQTimeOutError)
|
40
|
+
lambda { @queue.get_message({:timeout => 2}) }.should raise_error(RMQ::RMQTimeOutError)
|
41
41
|
end
|
42
42
|
|
43
43
|
it "should time out waiting for a message and not return any payload" do
|
44
|
-
lambda { @queue.get_message_payload(2) }.should raise_error(RMQ::RMQTimeOutError)
|
44
|
+
lambda { @queue.get_message_payload({:timeout => 2}) }.should raise_error(RMQ::RMQTimeOutError)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should find a message by id" do
|
48
|
+
message_id = @queue.put_message("I want to read this back")
|
49
|
+
message_id.should_not be_nil
|
50
|
+
|
51
|
+
message = @queue.find_message_by_id(message_id)
|
52
|
+
message.payload.should == "I want to read this back"
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should find not a message by id" do
|
56
|
+
lambda { @queue.find_message_by_id([1,2,3]) }.should raise_error(RMQ::RMQMessageNotFoundException)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should time out when finding a message by id" do
|
60
|
+
message_id = [1,2,3]
|
61
|
+
lambda { @queue.find_message_by_id(message_id, {:timeout => 2}) }.should raise_error(RMQ::RMQTimeOutError)
|
45
62
|
end
|
46
63
|
|
47
64
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rmq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-02-07 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &83963930 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '2.7'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *83963930
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: ffi
|
27
|
-
requirement: &
|
27
|
+
requirement: &83963600 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *83963600
|
36
36
|
description: Ruby wrapper around MQ series client library
|
37
37
|
email: sns@caimito.net
|
38
38
|
executables: []
|