Esempio n. 1
0
 private Behavior <BrokerAction, IActor> BehaviorRegisterWorker()
 {
     return(new Behavior <BrokerAction, IActor>
            (
                (b, a) => b == BrokerAction.RegisterWorker,
                (b, a) =>
     {
         WorkerStatus workerStatus = new WorkerStatus();
         workerStatus.TTL = 0;
         workerStatus.State = WorkerReadyState.Idle;
         fWorkers.Add(a, workerStatus);
         LogString("Worker Register", a.Tag.Key());
     }
            ));
 }
Esempio n. 2
0
 private Behavior <BrokerAction, IActor> BehaviorRegisterWorker()
 {
     return(new Behavior <BrokerAction, IActor>
            (
                (b, a) => b == BrokerAction.RegisterWorker,
                (b, a) =>
     {
         WorkerStatus workerStatus = new WorkerStatus
         {
             TimeToLive = 0,
             State = WorkerReadyState.Idle
         };
         _workers.Add(a, workerStatus);
         LogString("Worker Register", a.Tag.Key());
     }
            ));
 }
Esempio n. 3
0
        public BrokerActor() : base()
        {
            // heartbeat actor
            Become(BehaviorBrokerStart());

            // register worker
            AddBehavior(BehaviorRegisterWorker());

            // unregister worker
            AddBehavior(BehaviorUnregisterWorker());

            // process client request
            AddBehavior(BehaviorProcessClientRequest());

            // worker refuse job
            AddBehavior(new Behavior <IActor, WorkerReadyState, ActorTag>
                        (
                            (a, s, t) => s == WorkerReadyState.Busy,
                            (a, s, t) =>
            {
                _workers[a].State = WorkerReadyState.Busy;
                LogString("Worker {0} can't process request {1}", a.Tag.Key(), t.Key());
                IActor worker = FindWorker();
                if (worker != null)
                {
                    _workers[worker].State      = WorkerReadyState.Busy;
                    _workers[worker].TimeToLive = 0;
                    worker.SendMessage((IActor)this, t, _requests[t]);
                    LogString("ReProcessing Request {0} on worker {1}", a.Tag.Key(), t.Key());
                }
                else
                {
                    LogString("Wait for a worker for Request {0}", t.Key());
                }
            }
                        ));
            // worker finished job
            AddBehavior(new Behavior <IActor, WorkerReadyState, ActorTag>
                        (
                            (a, s, t) => s == WorkerReadyState.Idle,
                            (a, s, t) =>
            {
                _requestProcessed++;
                _requests.Remove(t);
                _workers[a].State      = WorkerReadyState.Idle;
                _workers[a].TimeToLive = _ttl;
                LogString("Request {0} End on worker {1}", t.Key(), a.Tag.Key());
                // find a request
                RequestStatus <T> tagRequest = _requests.Values.FirstOrDefault(v => v.State == RequestState.Unprocessed);
                if (tagRequest == null)
                {
                    return;
                }

                _workers[a].State      = WorkerReadyState.Busy;
                _workers[a].TimeToLive = 0;
                tagRequest.State       = RequestState.Running;
                a.SendMessage((IActor)this, tagRequest.Tag, tagRequest.Data);
                LogString("Processing Request {0} reusing worker {1}", tagRequest.Tag.Key(), a.Tag.Key());
            }
                        ));
            // heartbeatactor
            AddBehavior(new Behavior <HeartBeatActor, HeartBeatAction>
                        (
                            (a, h) =>
            {
                foreach (KeyValuePair <IActor, WorkerStatus> worker in _workers.Where(w => w.Value.TimeToLive < _ttl))
                {
                    worker.Key.SendMessage((IActor)this, BrokerAction.Hearbeat);
                }

                _ttl++;
                LogString("Heart Beat Signal, Request Processed {0}", _requestProcessed);
            }
                        ));
            // heartbeat answer
            AddBehavior(new Behavior <IActor, WorkerReadyState>(
                            (a, w) =>
            {
                WorkerStatus workerState = _workers[a];
                workerState.TimeToLive   = _ttl;
                LogString("Answer To HeartBeat from Worker {0}", a.Tag.Key());
            }));
            // start heart beat
            SendMessage(BrokerAction.Start);
        }