rmq 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|