From 99c45abda124cb4ca936f51702de420329276616 Mon Sep 17 00:00:00 2001 From: Dmytro Milinevskyy Date: Mon, 23 Feb 2015 23:02:53 +0100 Subject: [PATCH] handle messages on behalf of receiving actor --- lib/dcell.rb | 1 - lib/dcell/celluloid_ext.rb | 17 +++++++++++++++++ lib/dcell/messages.rb | 34 ++++++++++++---------------------- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/lib/dcell.rb b/lib/dcell.rb index 7fe178b..87622a4 100644 --- a/lib/dcell.rb +++ b/lib/dcell.rb @@ -53,7 +53,6 @@ def setup(options = {}) addr: "tcp://127.0.0.1:*", heartbeat_rate: 5, heartbeat_timeout: 10, - async_pool_size: 50, id: nil, }.merge(options) diff --git a/lib/dcell/celluloid_ext.rb b/lib/dcell/celluloid_ext.rb index 50bec79..ffc165f 100644 --- a/lib/dcell/celluloid_ext.rb +++ b/lib/dcell/celluloid_ext.rb @@ -19,6 +19,23 @@ def to_msgpack(pk=nil) end end + module InstanceMethods + def ____dcell_dispatch(message) + info = message.message + begin + value = nil + if info[:block] + send(info[:meth], *info[:args]) {|v| value = v} + else + value = send(info[:meth], *info[:args]) + end + message.success value + rescue => e + message.exception e + end + end + end + module ClassMethods def supervise_as(name, *args, &block) DCell.add_local_actor name diff --git a/lib/dcell/messages.rb b/lib/dcell/messages.rb index 05b3018..202ba03 100644 --- a/lib/dcell/messages.rb +++ b/lib/dcell/messages.rb @@ -115,32 +115,22 @@ def initialize(sender, message) @sender, @message = sender, message end - def __dispatch(actor) - value = nil - mailbox = actor.mailbox - if @message[:async] - if mailbox.size > DCell.async_pool_size - Logger.info "Mailbox of actor '#{@message[:actor]}' is full, syncing" - Celluloid::Actor::call mailbox, @message[:meth], *@message[:args] {|v| value = v} - else - Celluloid::Actor::async mailbox, @message[:meth], *@message[:args] - end - return nil - end - if @message[:block] - Celluloid::Actor::call mailbox, @message[:meth], *@message[:args] {|v| value = v} - else - value = Celluloid::Actor::call mailbox, @message[:meth], *@message[:args] - end - SuccessResponse.new(@id, @sender[:address], value) - rescue => e - ErrorResponse.new(@id, @sender[:address], {class: e.class.name, msg: e.to_s}) + def success(value) + respond SuccessResponse.new(@id, @sender[:address], value) + end + + def exception(e) + respond ErrorResponse.new(@id, @sender[:address], {class: e.class.name, msg: e.to_s}) end def dispatch actor = DCell.get_local_actor @message[:actor].to_sym - rsp = __dispatch actor - respond rsp if rsp + begin + mailbox = actor.mailbox + Celluloid::Actor::async mailbox, :____dcell_dispatch, self + rescue => e + respond ErrorResponse.new(@id, @sender[:address], {class: e.class.name, msg: e.to_s}) + end end def to_msgpack(pk=nil)