Class: AMQP::Protocol::Header

Inherits:
Object
  • Object
show all
Defined in:
lib/amqp/protocol.rb

Overview

:startdoc:

Contains a properties hash that holds some potentially interesting information.

  • :delivery_mode

1 equals transient. 2 equals persistent. Unconsumed persistent messages will survive a server restart when they are stored in a durable queue.

  • :redelivered

True or False

  • :routing_key

The routing string used for matching this message to this queue.

  • :priority

An integer in the range of 0 to 9 inclusive.

  • :content_type

Always “application/octet-stream” (byte stream)

  • :exchange

The source exchange which published this message.

  • :message_count

The number of unconsumed messages contained in the queue.

  • :delivery_tag

A monotonically increasing integer. This number should not be trusted as a sequence number. There is no guarantee it won’t get reset.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Header

Returns a new instance of Header.



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/amqp/protocol.rb', line 92

def initialize *args
  opts = args.pop if args.last.is_a? Hash
  opts ||= {}
  
  first = args.shift
  
  if first.is_a? ::Class and first.ancestors.include? Protocol::Class
    @klass = first
    @size = args.shift || 0
    @weight = args.shift || 0
    @properties = opts

  elsif first.is_a? Buffer or first.is_a? String
    buf = first
    buf = Buffer.new(buf) unless buf.is_a? Buffer
    
    @klass = Protocol.classes[buf.read(:short)]
    @weight = buf.read(:short)
    @size = buf.read(:longlong)

    props = buf.read(:properties, *klass.properties.map{|type,_| type })
    @properties = Hash[*klass.properties.map{|_,name| name }.zip(props).reject{|k,v| v.nil? }.flatten]

  else
    raise ArgumentError, 'Invalid argument'
  end
  
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(meth, *args, &blk) ⇒ Object



148
149
150
151
# File 'lib/amqp/protocol.rb', line 148

def method_missing meth, *args, &blk
  @properties.has_key?(meth) || @klass.properties.find{|_,name| name == meth } ? @properties[meth] :
                                                                                 super
end

Instance Attribute Details

#klassObject

Returns the value of attribute klass.



120
121
122
# File 'lib/amqp/protocol.rb', line 120

def klass
  @klass
end

#propertiesObject

Returns the value of attribute properties.



120
121
122
# File 'lib/amqp/protocol.rb', line 120

def properties
  @properties
end

#sizeObject

Returns the value of attribute size.



120
121
122
# File 'lib/amqp/protocol.rb', line 120

def size
  @size
end

#weightObject

Returns the value of attribute weight.



120
121
122
# File 'lib/amqp/protocol.rb', line 120

def weight
  @weight
end

Instance Method Details

#==(header) ⇒ Object



142
143
144
145
146
# File 'lib/amqp/protocol.rb', line 142

def == header
  [ :klass, :size, :weight, :properties ].inject(true) do |eql, field|
    eql and __send__(field) == header.__send__(field)
  end
end

#to_binaryObject



122
123
124
125
126
127
128
129
130
131
132
# File 'lib/amqp/protocol.rb', line 122

def to_binary
  buf = Buffer.new
  buf.write :short, klass.id
  buf.write :short, weight # XXX rabbitmq only supports weight == 0
  buf.write :longlong, size
  buf.write :properties, (klass.properties.map do |type, name|
                           [ type, properties[name] || properties[name.to_s] ]
                         end)
  buf.rewind
  buf
end

#to_frame(channel = 0) ⇒ Object



138
139
140
# File 'lib/amqp/protocol.rb', line 138

def to_frame channel = 0
  Frame::Header.new(self, channel)
end

#to_sObject



134
135
136
# File 'lib/amqp/protocol.rb', line 134

def to_s
  to_binary.to_s
end