Sha256: af7847f2dc528050d8ecbeed94767c2f00d34eec0b745e481e6eeb8b8c7ec522

Contents?: true

Size: 1.33 KB

Versions: 1

Compression:

Stored size: 1.33 KB

Contents

module Routing 
   def self.load_balancer_actor(actors)
      router = Actors.actor_of(Dispatcher).start
      router | ActorList.new(actors)
      router
   end

   def self.Broadcast(message)
      return B.new(message)
   end

   class B #:nodoc:
      def initialize(message)
         @message = message
      end

      def message
         @message
      end
   end

   class ActorList #:nodoc:
      def initialize(actors)
         @actors = actors
         @free_actors = Queue.new
         @actors.each { |actor| @free_actors << actor }
      end

      def broadcast(message)
         @actors.each do |actor|
            actor | message
         end
      end

      def get_actor
         @free_actors.shift
      end

      def release_actor(actor)
         @free_actors << actor
      end
   end

   class Dispatcher < Actor
      def receive(message)
         if message.instance_of? Routing::ActorList
            @list = message
         elsif message.instance_of? Routing::B
            @list.broadcast(message.message)
         else
            f = @list.get_actor
            unless f.nil?
               f < message
            else 
               Ara.debug("No free actor :(")
            end
         end
      end

      def actor_response_with_name(actor, r)
         @list.release_actor(actor)
         reply r
      end
   end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ara-0.0.3 lib/ara/routing.rb