Class: Fluffle::Server
- Inherits:
-
Object
- Object
- Fluffle::Server
- Defined in:
- lib/fluffle/server.rb
Class Attribute Summary collapse
-
.default_server ⇒ Object
Returns the value of attribute default_server.
Instance Attribute Summary collapse
-
#connection ⇒ Object
readonly
Returns the value of attribute connection.
-
#handlers ⇒ Object
readonly
Returns the value of attribute handlers.
Instance Method Summary collapse
- #connect(*args) ⇒ Object
- #connected? ⇒ Boolean
- #drain(queue: 'default', handler: nil, &block) ⇒ Object
- #handle_request(queue_name:, handler:, delivery_info:, properties:, payload:) ⇒ Object
-
#initialize(url: nil) ⇒ Server
constructor
A new instance of Server.
- #start ⇒ Object
Constructor Details
#initialize(url: nil) ⇒ Server
Returns a new instance of Server.
9 10 11 12 13 14 15 16 |
# File 'lib/fluffle/server.rb', line 9 def initialize(url: nil) self.connect(url) if url @handlers = {} @queues = {} self.class.default_server ||= self end |
Class Attribute Details
.default_server ⇒ Object
Returns the value of attribute default_server.
4 5 6 |
# File 'lib/fluffle/server.rb', line 4 def default_server @default_server end |
Instance Attribute Details
#connection ⇒ Object (readonly)
Returns the value of attribute connection.
7 8 9 |
# File 'lib/fluffle/server.rb', line 7 def connection @connection end |
#handlers ⇒ Object (readonly)
Returns the value of attribute handlers.
7 8 9 |
# File 'lib/fluffle/server.rb', line 7 def handlers @handlers end |
Instance Method Details
#connect(*args) ⇒ Object
18 19 20 21 22 23 |
# File 'lib/fluffle/server.rb', line 18 def connect(*args) self.stop if self.connected? @connection = Bunny.new *args @connection.start end |
#connected? ⇒ Boolean
25 26 27 |
# File 'lib/fluffle/server.rb', line 25 def connected? @connection&.connected? end |
#drain(queue: 'default', handler: nil, &block) ⇒ Object
29 30 31 32 33 34 35 36 37 |
# File 'lib/fluffle/server.rb', line 29 def drain(queue: 'default', handler: nil, &block) if handler && block raise ArgumentError, 'Cannot provide both handler: and block' end handler = Fluffle::Handlers::Dispatcher.new(&block) if block @handlers[queue.to_s] = handler end |
#handle_request(queue_name:, handler:, delivery_info:, properties:, payload:) ⇒ Object
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/fluffle/server.rb', line 59 def handle_request(queue_name:, handler:, delivery_info:, properties:, payload:) id = nil reply_to = properties[:reply_to] begin id, method, params = self.decode payload validate_request method: method result = handler.call id: id, method: method, params: params, meta: { reply_to: reply_to } rescue => err error = self.build_error_response err end response = { 'jsonrpc' => '2.0', 'id' => id } if error response['error'] = error else response['result'] = result end @exchange.publish Oj.dump(response), routing_key: reply_to, correlation_id: id end |
#start ⇒ Object
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/fluffle/server.rb', line 39 def start @channel = @connection.create_channel @exchange = @channel.default_exchange @handlers.each do |name, handler| qualified_name = Fluffle.request_queue_name name queue = @channel.queue qualified_name queue.subscribe do |delivery_info, properties, payload| self.handle_request queue_name: name, handler: handler, delivery_info: delivery_info, properties: properties, payload: payload end end @channel.work_pool.join end |