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()); } )); }
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()); } )); }
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); }