rmq 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -18,4 +18,13 @@ module RMQ
18
18
  class RMQTimeOutError < RuntimeError
19
19
  end
20
20
 
21
+ class RMQMessageNotFoundException < RuntimeError
22
+ def initialize(message_id)
23
+ end
24
+
25
+ def message
26
+ "Could not find message"
27
+ end
28
+ end
29
+
21
30
  end
@@ -10,5 +10,10 @@ module RMQ
10
10
  def reply_queue_name
11
11
  @message_descriptor[:ReplyToQ].to_s.strip
12
12
  end
13
+
14
+ def message_id
15
+ @message_descriptor[:MsgId]
16
+ end
17
+
13
18
  end
14
19
  end
@@ -22,7 +22,7 @@ module RMQ
22
22
  :Format, [:char, 8],
23
23
  :Priority, :long,
24
24
  :Persistence, :long,
25
- :MsgId, [:char, MSG_ID_LENGTH],
25
+ :MsgId, [:uint8, MSG_ID_LENGTH],
26
26
  :CorrelId, [:char, 24],
27
27
  :BackoutCount, :long,
28
28
  :ReplyToQ, [:char, 48],
@@ -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/ =~ RUBY_PLATFORM) != nil
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
- RUBY_PLATFORM.include?("linux")
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, timeout)
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(timeout, false)
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(timeout, accept_truncated_msg)
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 > 0
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 print_msg_id(msg_id)
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 !msg_id.nil?
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
 
@@ -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(timeout = 0)
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
- if (timeout > 0)
32
+ begin
31
33
  begin_time = Time.now.to_i
32
- begin
33
- message = get_message_from_queue(@queue_manager.connection_handle, @queue_handle, timeout)
34
- rescue RMQException
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
- close_queue(@queue_manager.connection_handle, @queue_handle, Constants::MQCO_NONE)
43
- @queue_handle = nil
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(timeout = 0)
51
- message = get_message(timeout)
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
@@ -1,3 +1,3 @@
1
1
  module RMQ
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -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.7
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: &70046720 !ruby/object:Gem::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: *70046720
24
+ version_requirements: *83963930
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: ffi
27
- requirement: &70045870 !ruby/object:Gem::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: *70045870
35
+ version_requirements: *83963600
36
36
  description: Ruby wrapper around MQ series client library
37
37
  email: sns@caimito.net
38
38
  executables: []