qpid_messaging 0.20.2 → 0.22.0

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.
Files changed (45) hide show
  1. data/ChangeLog +4 -0
  2. data/LICENSE +0 -4
  3. data/README.rdoc +15 -20
  4. data/TODO +10 -5
  5. data/ext/cqpid/cqpid.cpp +156 -40
  6. data/ext/cqpid/extconf.rb +10 -2
  7. data/lib/qpid_messaging.rb +56 -3
  8. data/lib/qpid_messaging/address.rb +51 -28
  9. data/lib/qpid_messaging/connection.rb +75 -46
  10. data/lib/qpid_messaging/duration.rb +49 -14
  11. data/lib/qpid_messaging/encoding.rb +5 -5
  12. data/lib/qpid_messaging/message.rb +61 -68
  13. data/lib/qpid_messaging/receiver.rb +62 -67
  14. data/lib/qpid_messaging/sender.rb +39 -56
  15. data/lib/qpid_messaging/session.rb +78 -81
  16. metadata +51 -61
  17. data/Rakefile +0 -137
  18. data/features/closing_a_connection.feature +0 -13
  19. data/features/closing_a_session.feature +0 -13
  20. data/features/connecting_to_a_broker.feature +0 -13
  21. data/features/creating_a_receiver.feature +0 -29
  22. data/features/creating_a_sender.feature +0 -25
  23. data/features/creating_a_session.feature +0 -12
  24. data/features/getting_the_connections_authenticated_username.feature +0 -8
  25. data/features/receiving_a_message.feature +0 -30
  26. data/features/sending_a_message.feature +0 -21
  27. data/features/session_returns_its_connection.feature +0 -12
  28. data/features/sessions_have_names.feature +0 -8
  29. data/features/step_definitions/address_steps.rb +0 -22
  30. data/features/step_definitions/connection_steps.rb +0 -93
  31. data/features/step_definitions/receiver_steps.rb +0 -69
  32. data/features/step_definitions/sender_steps.rb +0 -34
  33. data/features/step_definitions/session_steps.rb +0 -99
  34. data/features/support/env.rb +0 -22
  35. data/lib/qpid_messaging/errors.rb +0 -33
  36. data/lib/qpid_messaging/version.rb +0 -31
  37. data/spec/qpid_messaging/address_spec.rb +0 -87
  38. data/spec/qpid_messaging/connection_spec.rb +0 -191
  39. data/spec/qpid_messaging/duration_spec.rb +0 -56
  40. data/spec/qpid_messaging/encoding_spec.rb +0 -63
  41. data/spec/qpid_messaging/message_spec.rb +0 -305
  42. data/spec/qpid_messaging/receiver_spec.rb +0 -170
  43. data/spec/qpid_messaging/sender_spec.rb +0 -135
  44. data/spec/qpid_messaging/session_spec.rb +0 -353
  45. data/spec/spec_helper.rb +0 -20
@@ -1,4 +1,4 @@
1
- #
1
+ #--
2
2
  # Licensed to the Apache Software Foundation (ASF) under one
3
3
  # or more contributor license agreements. See the NOTICE file
4
4
  # distributed with this work for additional information
@@ -15,19 +15,19 @@
15
15
  # KIND, either express or implied. See the License for the
16
16
  # specific language governing permissions and limitations
17
17
  # under the License.
18
- #
18
+ #++
19
19
 
20
20
  module Qpid
21
21
 
22
22
  module Messaging
23
23
 
24
24
  # Encodes the supplied content into the given message.
25
- def self.encode content, message, encoding = nil
25
+ def self.encode content, message, encoding = nil # :nodoc:
26
26
  Cqpid::encode content, message.message_impl, encoding
27
27
  end
28
28
 
29
29
  # Decodes and returns the message's content.
30
- def self.decode(message, content_type = nil)
30
+ def self.decode(message, content_type = nil) # :nodoc:
31
31
  content_type = message.content_type if content_type.nil?
32
32
 
33
33
  case content_type
@@ -42,7 +42,7 @@ module Qpid
42
42
 
43
43
  # Takes as input any type and converts anything that's a symbol
44
44
  # into a string.
45
- def self.stringify(value)
45
+ def self.stringify(value) # :nodoc:
46
46
  # set the default value
47
47
  result = value
48
48
 
@@ -1,4 +1,4 @@
1
- #
1
+ #--
2
2
  # Licensed to the Apache Software Foundation (ASF) under one
3
3
  # or more contributor license agreements. See the NOTICE file
4
4
  # distributed with this work for additional information
@@ -15,27 +15,26 @@
15
15
  # KIND, either express or implied. See the License for the
16
16
  # specific language governing permissions and limitations
17
17
  # under the License.
18
- #
18
+ #++
19
19
 
20
20
  module Qpid
21
21
 
22
22
  module Messaging
23
23
 
24
24
  # A +Message+ represents an routable piece of information.
25
- #
26
- # The content for a message is automatically encoded and decoded.
27
- #
28
25
  class Message
29
26
 
30
- # Creates a new instance of +Message+.
27
+ # Creates a +Message+.
31
28
  #
32
29
  # ==== Options
33
30
  #
34
- # * :content - The content.
31
+ # * +:content+ - the content
35
32
  #
36
33
  # ==== Examples
37
34
  #
35
+ # # create a simple message and sends it
38
36
  # message = Qpid::Messaging::Message.new :content => "This is a message."
37
+ # sender.send message
39
38
  #
40
39
  def initialize(args = {})
41
40
  @message_impl = (args[:impl] if args[:impl]) || nil
@@ -49,15 +48,20 @@ module Qpid
49
48
  @message_impl
50
49
  end
51
50
 
52
- # Sets the address to which replies should be sent for the +Message+.
51
+ # Sets the reply-to address.
52
+ #
53
+ # The address can either be an instance of Address or else and
54
+ # address string.
53
55
  #
54
56
  # ==== Options
55
57
  #
56
- # * address - an instance of +Address+, or an address string
58
+ # * +address+ - the address
57
59
  #
58
60
  # ==== Examples
59
61
  #
62
+ # # set replies using an Address
60
63
  # msg.reply_to = Qpid:Messaging::Address.new "my-responses"
64
+ # # set replies using an address string
61
65
  # msg.reply_to = "my-feed/responses"
62
66
  #
63
67
  def reply_to=(address)
@@ -67,7 +71,6 @@ module Qpid
67
71
  end
68
72
 
69
73
  # Returns the reply to address for the +Message+.
70
- #
71
74
  def reply_to
72
75
  address_impl = @message_impl.getReplyTo
73
76
  # only return an address if a reply to was specified
@@ -78,25 +81,15 @@ module Qpid
78
81
  #
79
82
  # ==== Options
80
83
  #
81
- # * subject - the subject
82
- #
83
- # ==== Examples
84
- #
85
- # msg.subject = "mysubject"
86
- #
84
+ # * +subject+ - the subject
87
85
  def subject=(subject); @message_impl.setSubject subject; end
88
86
 
89
87
  # Returns the subject of the +Message+.
90
- #
91
- # ==== Options
92
- #
93
- # puts "The subject is #{msg.subject}"
94
- #
95
88
  def subject; @message_impl.getSubject; end
96
89
 
97
90
  # Sets the content type for the +Message+.
98
91
  #
99
- # This should be set by the sending applicaton and indicates to
92
+ # This should be set by the sending application and indicates to the
100
93
  # recipients of the message how to interpret or decode the content.
101
94
  #
102
95
  # By default, only dictionaries and maps are automatically given a content
@@ -105,23 +98,17 @@ module Qpid
105
98
  #
106
99
  # ==== Options
107
100
  #
108
- # * content_type - the content type.
109
- #
110
- def content_type=(content_type); @message_impl.setContentType content_type; end
111
-
112
- # Returns the content type for the +Message+.
101
+ # * +content_type+ - the content type
113
102
  #
114
103
  # ==== Examples
115
104
  #
116
- # case msg.content_type
117
- # when "myapp/image"
118
- # ctl.handle_image msg
119
- # end
120
- # when "myapp/audio"
121
- # ctl.handle_audio msg
122
- # end
123
- # end
105
+ # # send base64 encoded data in a mesage
106
+ # msg = Qpid::Messaging::Message.new :content = "UXBpZCBSdWxlcyEK"
107
+ # msg.content_type = "application/base64"
124
108
  #
109
+ def content_type=(content_type); @message_impl.setContentType content_type; end
110
+
111
+ # Returns the content type for the +Message+.
125
112
  def content_type; @message_impl.getContentType; end
126
113
 
127
114
  # Sets the message id.
@@ -131,16 +118,17 @@ module Qpid
131
118
  #
132
119
  # ==== Options
133
120
  #
134
- # * id - the id
121
+ # * +id+ - the id
135
122
  #
136
123
  # ==== Examples
137
124
  #
125
+ # # this example only works in Ruby >= 1.9, for 1.8 use a UUID library
126
+ # require 'SecureRandom'
127
+ # msg.message_id = SecureRandom.uuid
138
128
  #
139
129
  def message_id=(message_id); @message_impl.setMessageId message_id.to_s; end
140
130
 
141
131
  # Returns the message id.
142
- #
143
- # See +message_id=+ for details.
144
132
  def message_id; @message_impl.getMessageId; end
145
133
 
146
134
  # Sets the user id for the +Message+.
@@ -149,44 +137,38 @@ module Qpid
149
137
  # the connection itself, as the messaging infrastructure will verify
150
138
  # this.
151
139
  #
152
- # See +Qpid::Messaging::Connection.authenticated_username+
140
+ # See Qpid::Messaging::Connection.authenticated_username
153
141
  #
154
142
  # *NOTE:* If the id is not a +String+ then the id is set using
155
143
  # the object's string representation.
156
144
  #
157
145
  # ==== Options
158
146
  #
159
- # * id - the id
147
+ # * +id+ - the id
160
148
  #
161
149
  def user_id=(user_id); @message_impl.setUserId user_id; end
162
150
 
163
151
  # Returns the user id for the +Message+.
164
- #
165
- # See +user_id=+ for details.
166
- #
167
152
  def user_id; @message_impl.getUserId; end
168
153
 
169
154
  # Sets the correlation id of the +Message+.
170
155
  #
171
156
  # The correlation id can be used as part of a protocol for message
172
- # exchange patterns; e.g., a requestion-response pattern might require
157
+ # exchange patterns; e.g., a request-response pattern might require
173
158
  # the correlation id of the request and the response to match, or it
174
159
  # might use the message id of the request as the correlation id on
175
- # the response
160
+ # the response.
176
161
  #
177
162
  # *NOTE:* If the id is not a +String+ then the id is setup using
178
163
  # the object's string representation.
179
164
  #
180
165
  # ==== Options
181
166
  #
182
- # * id - the id
167
+ # * +id+ - the id
183
168
  #
184
169
  def correlation_id=(correlation_id); @message_impl.setCorrelationId correlation_id; end
185
170
 
186
171
  # Returns the correlation id of the +Message+.
187
- #
188
- # *NOTE:* See +correlation_id=+ for details.
189
- #
190
172
  def correlation_id; @message_impl.getCorrelationId; end
191
173
 
192
174
  # Sets the priority of the +Message+.
@@ -200,19 +182,21 @@ module Qpid
200
182
  #
201
183
  # ==== Options
202
184
  #
203
- # * priority - the priority
185
+ # * +priority+ - the priority
204
186
  #
205
187
  def priority=(priority); @message_impl.setPriority priority; end
206
188
 
207
189
  # Returns the priority for the +Message+.
208
- #
209
190
  def priority; @message_impl.getPriority; end
210
191
 
211
192
  # Sets the time-to-live in milliseconds.
212
193
  #
194
+ # This can be used by the messaging infrastructure to discard messages
195
+ # that are no longer of relevance.
196
+ #
213
197
  # ==== Options
214
198
  #
215
- # * duration - the number of milliseconds
199
+ # * +duration+ - the number of milliseconds
216
200
  #
217
201
  def ttl=(duration)
218
202
  if duration.is_a? Qpid::Messaging::Duration
@@ -229,16 +213,15 @@ module Qpid
229
213
  #
230
214
  # This is a hint to the messaging infrastructure that the message
231
215
  # should be persisted or otherwise stored. This helps to ensure
232
- # that th emessage is not lost during to failures or a shutdown.
216
+ # that the message is not lost due to failures or a shutdown.
233
217
  #
234
218
  # ==== Options
235
219
  #
236
- # * durable - the durability flag (def. false)
220
+ # * +durable+ - the durability flag (def. false)
237
221
  #
238
222
  def durable=(durable); @message_impl.setDurable durable; end
239
223
 
240
224
  # Returns the durability for the +Message+.
241
- #
242
225
  def durable; @message_impl.getDurable; end
243
226
 
244
227
  # This is a hint to the messaging infrastructure that if de-duplication
@@ -247,17 +230,16 @@ module Qpid
247
230
  #
248
231
  # ==== Options
249
232
  #
250
- # * redelivered - sets the redelivered state (def. false)
233
+ # * +redelivered+ - sets the redelivered state (def. false)
251
234
  #
252
235
  # ==== Examples
253
236
  #
254
- # # processed is an array of processed message ids
237
+ # # processed is a collection of messages already received
255
238
  # msg.redelivered = true if processed.include? msg.message_id
256
239
  #
257
240
  def redelivered=(redelivered); @message_impl.setRedelivered redelivered; end
258
241
 
259
242
  # Returns whether the +Message+ has been marked as redelivered.
260
- #
261
243
  def redelivered; @message_impl.getRedelivered; end
262
244
 
263
245
  # Returns all named properties.
@@ -265,14 +247,13 @@ module Qpid
265
247
  # *NOTE:* It is recommended to use the []= method for
266
248
  # retrieving and setting properties. Using this method may
267
249
  # result in non-deterministic behavior.
268
- #
269
250
  def properties; @message_impl.getProperties; end
270
251
 
271
252
  # Returns the value for the named property.
272
253
  #
273
254
  # ==== Options
274
255
  #
275
- # * name - the property name
256
+ # * +name+ - the property name
276
257
  #
277
258
  # ==== Examples
278
259
  #
@@ -283,10 +264,21 @@ module Qpid
283
264
 
284
265
  # Assigns a value to the named property.
285
266
  #
267
+ # A property's name or value, if a symbol, will be converted to a string
268
+ # representation. However, you will still be able to access them using
269
+ # a symbol for the name.
270
+ #
286
271
  # ==== Options
287
272
  #
288
- # * name - the property name
289
- # * value - the property value
273
+ # * +name+ - the property name
274
+ # * +value+ - the property value
275
+ #
276
+ # ==== Examples
277
+ #
278
+ # # set the signed attribute on a message and then retrieve it
279
+ # msg[:signed] = true # sets "signed" => true
280
+ # puts "It's signed" if msg["signed"] # outputs "It's signed"
281
+ #
290
282
  def []=(key, value)
291
283
  @message_impl.setProperty(key.to_s,
292
284
  Qpid::Messaging.stringify(value))
@@ -295,17 +287,19 @@ module Qpid
295
287
  # Sets the content for the +Message+.
296
288
  #
297
289
  # Content is automatically encoded for Array and Hash types. Other types
298
- # need to set their own content types (via +content_type+) in order to
290
+ # need to set their own content types (via content_type) in order to
299
291
  # specify how recipients should process the content.
300
292
  #
301
293
  # ==== Options
302
294
  #
303
- # * content - the content
295
+ # * +content+ - the content
304
296
  #
305
297
  # ==== Examples
306
298
  #
307
- # msg.content = "This is a simple message." # a simple message
308
- # msg.content = {:foo => :bar} # content is automatically encoded
299
+ # # set a simple content for a message
300
+ # msg.content = "This is a simple message."
301
+ # # sets content that is automatically encoded
302
+ # msg.content = {:foo => :bar}
309
303
  #
310
304
  def content=(content)
311
305
  content_type = nil
@@ -348,8 +342,7 @@ module Qpid
348
342
  @content
349
343
  end
350
344
 
351
- # Returns the content's size.
352
- #
345
+ # Returns the content's size in bytes.
353
346
  def content_size; @message_impl.getContentSize; end
354
347
 
355
348
  end
@@ -1,4 +1,4 @@
1
- #
1
+ #--
2
2
  # Licensed to the Apache Software Foundation (ASF) under one
3
3
  # or more contributor license agreements. See the NOTICE file
4
4
  # distributed with this work for additional information
@@ -15,23 +15,32 @@
15
15
  # KIND, either express or implied. See the License for the
16
16
  # specific language governing permissions and limitations
17
17
  # under the License.
18
- #
18
+ #++
19
19
 
20
20
  module Qpid
21
21
 
22
22
  module Messaging
23
23
 
24
- # Receiver is the entity through which messages are received.
24
+ # +Receiver+ is the entity through which messages are received.
25
25
  #
26
- # An instance of Receiver can only be created using an active (not
27
- # previously closed) Session.
26
+ # An instance of +Receiver+ can only be created using an active (i.e., not
27
+ # previously closed) Session. See Qpid::Messaging::Session.create_receiver
28
+ # for more details.
28
29
  #
29
30
  # ==== Example
30
31
  #
32
+ # # create a connection and a session
31
33
  # conn = Qpid::Messaging::Connection.new :url => "mybroker:5762"
32
34
  # conn.open
33
35
  # session = conn.create_session
34
- # receiver = session.create_receiver "my-sender-queue"
36
+ #
37
+ # # create a receiver that listens on the "updates" topic of "alerts"
38
+ # receiver = session.create_receiver "alerts/updates"
39
+ #
40
+ # # wait for an incoming message and process it
41
+ # incoming = receiver.get Qpid::Messaging::Duration::FOREVER
42
+ # process(incoming)
43
+ #
35
44
  class Receiver
36
45
 
37
46
  def initialize(session, receiver_impl) # :nodoc:
@@ -46,27 +55,24 @@ module Qpid
46
55
  # Retrieves a message from the local queue, or waits for up to
47
56
  # the duration specified for one to become available.
48
57
  #
49
- # If a block is given, then it will be invaked after the next message
50
- # is received or the call times out, passing in the message or nil
51
- # respectively.
58
+ # If no message is received within the specified time then a
59
+ # MessagingException is raised.
52
60
  #
53
61
  # ==== Options
54
- # * duration - the timeout to wait (def. Duration::FOREVER)
55
- #
56
- # ==== Examples
57
62
  #
58
- # msg = rcvr.get # Uses the default timeout of forever
63
+ # * duration - the timeout to wait
59
64
  #
60
- # msg = rcvr.get Qpid::Messaging::Duration::IMMEDIATE # returns a message or exits immediately
65
+ # ==== Examples
61
66
  #
62
- # # passes in a block to handle the received message
63
- # rcvr.get Qpid::Messaging::Duration::SECOND do |message|
64
- # if message.nil?
65
- # puts "No message was received."
66
- # else
67
- # puts "Received this message: #{message.content}"
68
- # end
67
+ # # retrieves a message, also handles exceptions raised on no messages
68
+ # begin
69
+ # # checks for a message, returning immediately
70
+ # msg = recv.get Qpid::Messaging::Duration::IMMEDIATE
71
+ # puts "Received this message: #{message.content}"
72
+ # rescue
73
+ # puts "No messages available.
69
74
  # end
75
+ #
70
76
  def get(duration = Qpid::Messaging::Duration::FOREVER)
71
77
  message_impl = @receiver_impl.get duration.duration_impl
72
78
  create_message_wrapper message_impl unless message_impl.nil?
@@ -75,33 +81,35 @@ module Qpid
75
81
  # Retrieves a message from the receiver's subscription, or waits
76
82
  # for up to the duration specified for one to become available.
77
83
  #
78
- # If a block is given, then it will be invaked after the next message
79
- # is received or the call times out, passing in the message or nil
80
- # respectively.
84
+ # If no message is fetched within the specified time then a
85
+ # MessagingException is raised.
81
86
  #
82
87
  # ==== Options
88
+ #
83
89
  # * duration - the timeout to wait (def. Duration::FOREVER)
84
90
  #
85
91
  # ==== Examples
86
92
  #
87
- # msg = rcvr.fetch # Uses the default timeout of forever
88
- #
89
- # msg = rcvr.fetch Qpid::Messaging::Duration::IMMEDIATE # returns a message or exits immediately
90
- #
91
- # # passes in a block to handle the received message
92
- # rcvr.fetch Qpid::Messaging::Duration::SECOND do |message|
93
- # if message.nil?
94
- # puts "No message was received."
95
- # else
96
- # puts "Received this message: #{message.content}"
97
- # end
93
+ # # retrieves a message, also handles exceptions raised on no messages
94
+ # begin
95
+ # # checks for a message, times out after one second
96
+ # msg = recv.fetch Qpid::Messaging::Duration::SECOND
97
+ # puts "Fetched this message: #{message.content}"
98
+ # rescue
99
+ # puts "No messages available.
98
100
  # end
101
+ #
99
102
  def fetch(duration = Qpid::Messaging::Duration::FOREVER)
100
103
  message_impl = @receiver_impl.fetch duration.duration_impl
101
104
  create_message_wrapper message_impl unless message_impl.nil?
102
105
  end
103
106
 
104
- # Sets the capacity for this +Receiver+.
107
+ # Sets the capacity.
108
+ #
109
+ # The capacity of a +Receiver+ is the number of Messages that can be
110
+ # pre-fetched from the broker and held locally. If capacity is 0 then
111
+ # messages will never be pre-fetched and all messages must instead be
112
+ # retrieved using #fetch.
105
113
  #
106
114
  # ==== Options
107
115
  #
@@ -109,63 +117,50 @@ module Qpid
109
117
  #
110
118
  # ==== Examples
111
119
  #
112
- # receiver.capacity = 50 # sets the incoming capacity to 50 messages
120
+ # # create a receiver and give it a capacity of 50
121
+ # recv = session.create_receiver "alerts/minor"
122
+ # recv.capacity = 50
113
123
  #
114
124
  def capacity=(capacity); @receiver_impl.setCapacity capacity; end
115
125
 
116
126
  # Returns the capacity.
117
- #
118
- #
119
- # The capacity is the numnber of incoming messages that can be held
120
- # locally before being fetched.
121
- #
122
- # ==== Examples
123
- #
124
- # puts "The receiver can hold #{rcv.capacity} messages."
125
- #
126
127
  def capacity; @receiver_impl.getCapacity; end
127
128
 
128
- # Returns the number of slots for receiving messages.
129
+ # Returns the number of messages locally held.
130
+ #
131
+ # The available is always 0 <= available <= capacity.
129
132
  #
130
- # This differs from +capacity+ in that it is the available slots in
131
- # the capacity for holding incoming messages, where available <= capacity.
133
+ # If the #capacity is set to 0 then available will always be 0.
132
134
  #
133
135
  # ==== Examples
134
136
  #
135
- # puts "You can receive #{rcv.available} messages before blocking."
137
+ # # output the number of messages waiting while processing
138
+ # loop do
139
+ # puts "There are #{recv.available} messages pending..."
140
+ # # wait forever (the default) for the next message
141
+ # msg = recv.get
142
+ # # process the message
143
+ # dispatch_message msg
144
+ # end
136
145
  #
137
146
  def available; @receiver_impl.getAvailable; end
138
147
 
139
148
  # Returns the number of messages that have been received and acknowledged
140
149
  # but whose acknowledgements have not been confirmed by the sender.
141
- #
142
- # ==== Examples
143
- #
144
- # puts "You have #{rcv.unsettled} messages to be confirmed."
145
- #
146
150
  def unsettled; @receiver_impl.getUnsettled; end
147
151
 
148
152
  # Closes this +Receiver+.
149
153
  #
150
- # This does not affect the +Session+.
154
+ # This does not affect the owning Session or Connection.
151
155
  def close; @receiver_impl.close; end
152
156
 
153
- # Returns whether the receiver is closed.
154
- #
155
- # ==== Examples
156
- #
157
- # recv.close unless recv.closed?
158
- #
157
+ # Returns whether the +Receiver+ is closed.
159
158
  def closed?; @receiver_impl.isClosed; end
160
159
 
161
160
  # Returns the name of this +Receiver+.
162
- #
163
- # ==== Examples
164
- #
165
- # puts "Receiver: #{recv.name}"
166
161
  def name; @receiver_impl.getName; end
167
162
 
168
- # Returns the Session for this +Receiver+.
163
+ # Returns the owning Session for this +Receiver+.
169
164
  def session; @session; end
170
165
 
171
166
  private