Class: Carrot::AMQP::Protocol::Header

Inherits:
Object
  • Object
show all
Defined in:
lib/carrot/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



89
90
91
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
# File 'lib/carrot/amqp/protocol.rb', line 89

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



145
146
147
148
# File 'lib/carrot/amqp/protocol.rb', line 145

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.



117
118
119
# File 'lib/carrot/amqp/protocol.rb', line 117

def klass
  @klass
end

#propertiesObject

Returns the value of attribute properties.



117
118
119
# File 'lib/carrot/amqp/protocol.rb', line 117

def properties
  @properties
end

#sizeObject

Returns the value of attribute size.



117
118
119
# File 'lib/carrot/amqp/protocol.rb', line 117

def size
  @size
end

#weightObject

Returns the value of attribute weight.



117
118
119
# File 'lib/carrot/amqp/protocol.rb', line 117

def weight
  @weight
end

Instance Method Details

#==(header) ⇒ Object



139
140
141
142
143
# File 'lib/carrot/amqp/protocol.rb', line 139

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

#to_binaryObject



119
120
121
122
123
124
125
126
127
128
129
# File 'lib/carrot/amqp/protocol.rb', line 119

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



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

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

#to_sObject



131
132
133
# File 'lib/carrot/amqp/protocol.rb', line 131

def to_s
  to_binary.to_s
end