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.
@@ -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: []