Class: BBK::App::Dispatcher::Message
- Inherits:
-
Object
- Object
- BBK::App::Dispatcher::Message
- Defined in:
- lib/bbk/app/dispatcher/message.rb
Overview
Базовый класс сообщений для фреймворка BBK
Direct Known Subclasses
Constant Summary collapse
- ALLOWED_FOR_DUMP =
типы данных, допустимые для Marshal#dump
[ Time, FalseClass, TrueClass, NilClass, String, Integer, Float, Symbol ].freeze
Instance Attribute Summary collapse
-
#body ⇒ Object
readonly
Returns the value of attribute body.
-
#consumer ⇒ Object
readonly
Returns the value of attribute consumer.
-
#delivery_info ⇒ Object
readonly
Returns the value of attribute delivery_info.
-
#headers ⇒ Object
readonly
Returns the value of attribute headers.
Instance Method Summary collapse
- #ack(*args, answer: nil, **kwargs) ⇒ Object
- #acked? ⇒ Boolean
-
#initialize(consumer, delivery_info, headers, body, *_args, **_kwargs) ⇒ Message
constructor
A new instance of Message.
-
#inspect ⇒ Object
:nodoc:.
-
#marshal_dump ⇒ Object
Реализация быстрой и “полной” сериализации через Marshal#dump Сложные объекты (которые могут содержать ‘Proc`, `IO` и пр.) нельзя сериализовывать, например в нутриBBK::AMQP::Message находится Consumer с такими членами.
- #marshal_dump_object(object) ⇒ Object
-
#marshal_load(array) ⇒ Object
Реализация быстрой и “полной” сериализации через Marshal#dump.
- #message_id ⇒ Object
- #metadata ⇒ Object
- #nack(*args, error: nil, **kwargs) ⇒ Object
- #nacked? ⇒ Boolean
-
#payload ⇒ Object
Lazy body parsing.
- #processed? ⇒ Boolean
- #protocol ⇒ Object
- #reply_message_id(addon) ⇒ Object
- #reply_to ⇒ Object
-
#restored? ⇒ Boolean
Признак того что обхект восстановлен после сериализации через #marshal_dump.
- #to_h ⇒ Object
- #user_id ⇒ Object
Constructor Details
#initialize(consumer, delivery_info, headers, body, *_args, **_kwargs) ⇒ Message
Returns a new instance of Message.
11 12 13 14 15 16 17 18 19 |
# File 'lib/bbk/app/dispatcher/message.rb', line 11 def initialize(consumer, delivery_info, headers, body, *_args, **_kwargs) @consumer = consumer @delivery_info = delivery_info @headers = headers.to_h.with_indifferent_access @body = body @acked = false @nacked = false @restored = false end |
Instance Attribute Details
#body ⇒ Object (readonly)
Returns the value of attribute body.
9 10 11 |
# File 'lib/bbk/app/dispatcher/message.rb', line 9 def body @body end |
#consumer ⇒ Object (readonly)
Returns the value of attribute consumer.
9 10 11 |
# File 'lib/bbk/app/dispatcher/message.rb', line 9 def consumer @consumer end |
#delivery_info ⇒ Object (readonly)
Returns the value of attribute delivery_info.
9 10 11 |
# File 'lib/bbk/app/dispatcher/message.rb', line 9 def delivery_info @delivery_info end |
#headers ⇒ Object (readonly)
Returns the value of attribute headers.
9 10 11 |
# File 'lib/bbk/app/dispatcher/message.rb', line 9 def headers @headers end |
Instance Method Details
#ack(*args, answer: nil, **kwargs) ⇒ Object
30 31 32 33 34 35 36 |
# File 'lib/bbk/app/dispatcher/message.rb', line 30 def ack(*args, answer: nil, **kwargs) return if processed? consumer.ack(self, *args, answer: answer, **kwargs) @acked = true nil end |
#acked? ⇒ Boolean
81 82 83 |
# File 'lib/bbk/app/dispatcher/message.rb', line 81 def acked? @acked end |
#inspect ⇒ Object
:nodoc:
77 78 79 |
# File 'lib/bbk/app/dispatcher/message.rb', line 77 def inspect # :nodoc: "#<#{self.class.name} @consumer=#{consumer.class.name}, @headers=#{headers.inspect}>" end |
#marshal_dump ⇒ Object
Реализация быстрой и “полной” сериализации через Marshal#dump Сложные объекты (которые могут содержать ‘Proc`, `IO` и пр.) нельзя сериализовывать, например в нутриBBK::AMQP::Message находится Consumer с такими членами.
Используется например при передачи объекта Message куда-то, например в ActiveJob
При наследовании можно использолвать так: “‘ruby
def marshal_dump
[@my_attribute] + super
end
def marshal_load(array)
@my_attribute, *parent_attributes = array
super(parent_attributes)
end
“‘
119 120 121 |
# File 'lib/bbk/app/dispatcher/message.rb', line 119 def marshal_dump [ nil, marshal_dump_object(@delivery_info), @headers, @body, @payload, true] end |
#marshal_dump_object(object) ⇒ Object
129 130 131 132 133 134 135 136 137 138 |
# File 'lib/bbk/app/dispatcher/message.rb', line 129 def marshal_dump_object(object) case object when Hash object.transform_values {|v| marshal_dump_object(v) } when Array, Enumerable object.map {|v| marshal_dump_object(v) } else ALLOWED_FOR_DUMP.include?(object.class) ? object : nil end end |
#marshal_load(array) ⇒ Object
Реализация быстрой и “полной” сериализации через Marshal#dump
125 126 127 |
# File 'lib/bbk/app/dispatcher/message.rb', line 125 def marshal_load(array) @consumer, @delivery_info, @headers, @body, @payload, @restored = array end |
#message_id ⇒ Object
50 51 52 |
# File 'lib/bbk/app/dispatcher/message.rb', line 50 def raise NotImplementedError.new("#{self.class.name} does not implement #{__method__} method") end |
#metadata ⇒ Object
46 47 48 |
# File 'lib/bbk/app/dispatcher/message.rb', line 46 def @metadata = payload.fetch(:metadata, {}) end |
#nack(*args, error: nil, **kwargs) ⇒ Object
38 39 40 41 42 43 44 |
# File 'lib/bbk/app/dispatcher/message.rb', line 38 def nack(*args, error: nil, **kwargs) return if processed? consumer.nack(self, *args, error: error, **kwargs) @nacked = true nil end |
#nacked? ⇒ Boolean
85 86 87 |
# File 'lib/bbk/app/dispatcher/message.rb', line 85 def nacked? @nacked end |
#payload ⇒ Object
Lazy body parsing
22 23 24 25 26 27 28 |
# File 'lib/bbk/app/dispatcher/message.rb', line 22 def payload @payload ||= begin Oj.load(@body).with_indifferent_access rescue StandardError {}.with_indifferent_access end end |
#processed? ⇒ Boolean
89 90 91 |
# File 'lib/bbk/app/dispatcher/message.rb', line 89 def processed? acked? || nacked? end |
#protocol ⇒ Object
62 63 64 |
# File 'lib/bbk/app/dispatcher/message.rb', line 62 def protocol raise NotImplementedError.new("#{self.class.name} does not implement #{__method__} method") end |
#reply_message_id(addon) ⇒ Object
66 67 68 |
# File 'lib/bbk/app/dispatcher/message.rb', line 66 def (addon) Digest::SHA1.hexdigest("#{addon}#{}") end |
#reply_to ⇒ Object
54 55 56 |
# File 'lib/bbk/app/dispatcher/message.rb', line 54 def reply_to raise NotImplementedError.new("#{self.class.name} does not implement #{__method__} method") end |
#restored? ⇒ Boolean
Признак того что обхект восстановлен после сериализации через #marshal_dump
94 95 96 |
# File 'lib/bbk/app/dispatcher/message.rb', line 94 def restored? @restored end |
#to_h ⇒ Object
70 71 72 73 74 75 |
# File 'lib/bbk/app/dispatcher/message.rb', line 70 def to_h { headers: headers, body: body } end |
#user_id ⇒ Object
58 59 60 |
# File 'lib/bbk/app/dispatcher/message.rb', line 58 def user_id raise NotImplementedError.new("#{self.class.name} does not implement #{__method__} method") end |