Class: Qpid::Proton::Delivery

Inherits:
Transfer
  • Object
show all
Defined in:
lib/core/delivery.rb

Overview

Allow a Receiver to indicate the status of a received message to the Sender

Constant Summary

Constants inherited from Transfer

Transfer::PROTON_METHOD_PREFIX, Transfer::State

Constants included from Qpid::Proton::Disposition::State

Qpid::Proton::Disposition::State::ACCEPTED, Qpid::Proton::Disposition::State::MODIFIED, Qpid::Proton::Disposition::State::RECEIVED, Qpid::Proton::Disposition::State::REJECTED, Qpid::Proton::Disposition::State::RELEASED

Instance Method Summary collapse

Methods inherited from Transfer

#connection, #id, #inspect, #link, #local_state, #session, #settle, #settled?, #state, #to_s, #transport, #update, #work_queue, wrap

Methods included from Qpid::Proton::Disposition::State::ClassMethods

#name_of

Constructor Details

#initialize(*args) ⇒ Delivery

Returns a new instance of Delivery.



21
# File 'lib/core/delivery.rb', line 21

def initialize(*args) super; @message = nil; end

Instance Method Details

#aborted?Boolean

Returns True if the transfer was aborted by the sender.

Returns:

  • (Boolean)

    True if the transfer was aborted by the sender.



74
# File 'lib/core/delivery.rb', line 74

proton_caller :aborted?

#accept

Accept the receiveed message.



27
# File 'lib/core/delivery.rb', line 27

def accept() settle ACCEPTED; end

#complete?Boolean

Returns true if the incoming message is complete, call #message to retrieve it.

Returns:

  • (Boolean)

    true if the incoming message is complete, call #message to retrieve it.



77
# File 'lib/core/delivery.rb', line 77

def complete?() readable? && !aborted? && !partial?; end

#messageMessage

Get the message from the delivery.

Returns:

Raises:

  • (AbortedError)

    if the message has been aborted (check with #aborted?

  • (UnderflowError)

    if the message is incomplete (check with #complete?

  • (::ArgumentError)

    if the delivery is not the current delivery on a receiving link.



84
85
86
87
88
89
90
91
92
93
94
# File 'lib/core/delivery.rb', line 84

def message
  unless @message
    raise AbortedError, "message aborted by sender" if aborted?
    raise UnderflowError, "incoming message incomplete" if partial?
    raise ArgumentError, "no incoming message" unless readable?
    @message = Message.new
    @message.decode(link.receive(pending))
    link.advance
  end
  @message
end

#modify

Deprecated.

use #release with modification options



68
69
70
71
# File 'lib/core/delivery.rb', line 68

def modify()
  deprecated __method__, "release(modification_options)"
  release failed=>true
end

#receiverReceiver

Returns The parent Receiver link.

Returns:



24
# File 'lib/core/delivery.rb', line 24

def receiver() link; end

#reject

Reject a message, indicating to the sender that is invalid and should never be delivered again to this or any other receiver.



31
# File 'lib/core/delivery.rb', line 31

def reject() settle REJECTED; end

#release(opts = nil)

Release a message, indicating to the sender that it was not processed but may be delivered again to this or another receiver.

Parameters:

  • opts (Hash) (defaults to: nil)

    Instructions to the sender to modify re-delivery. To allow re-delivery with no modifications at all use release(nil)

Options Hash (opts):

  • :failed (Boolean) — default: true

    Instruct the sender to increase Message#delivery_count so future receivers will know there was a previous failed delivery.

  • :undeliverable (Boolean) — default: false

    Instruct the sender that this message should never be re-delivered to this receiver, although it may be delivered other receivers.

  • :annotations (Hash)

    Instruct the sender to update the Message#annotations with these key=>value pairs before re-delivery, replacing existing entries in Message#annotations with the same key.



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/core/delivery.rb', line 50

def release(opts = nil)
  opts = { :failed => false } if (opts == false) # deprecated
  failed = !opts || opts.fetch(:failed, true)
  undeliverable = opts && opts[:undeliverable]
  annotations = opts && opts[:annotations]
  annotations = nil if annotations && annotations.empty?
  if failed || undeliverable || annotations
    d = Cproton.pn_delivery_local(@impl)
    Cproton.pn_disposition_set_failed(d, true) if failed
    Cproton.pn_disposition_set_undeliverable(d, true) if undeliverable
    Codec::Data.from_object(Cproton.pn_disposition_annotations(d), annotations) if annotations
    settle(MODIFIED)
  else
    settle(RELEASED)
  end
end