/** * Acquire a physician to proceed to a examination */ private bool GetPhysician() { if (AvailablePhysicians > 0) { AvailablePhysicians--; return(true); } // No physician is available in the service Thus we can ask the resource provider _provider.SendMessage(new Message(this, EnumMessage.RequestPhysician)); // Wait for the response of the provider WaitingResponse.WaitOne(); return(IsDemandAccepted); }
/** * Acquire a Emergency Room to be able to examine a patient */ private bool GetEmergencyRoom() { // Check if we have a free room in the service if (AvailableEmergencyRoom > 0) { AvailableEmergencyRoom--; return(true); } // Check if the Resource Provider has a room for us _provider.SendMessage(new Message(this, EnumMessage.RequestEmergencyRoom)); WaitingResponse.WaitOne(); return(IsDemandAccepted); }
private async Task SendMessages() { for (int i = 0; i < 5 && SendQueue.Count > 0; i++) { var details = SendQueue.Dequeue(); details.SentAt = ValueStopwatch.StartNew(); if (details.Message is QueryMessage) { WaitingResponse.Add(details.Message.TransactionId, details); } byte[] buffer = details.Message.Encode(); await Listener.SendAsync(buffer, details.Destination); } }
/** * The patient leaves the hospital */ private void Leaves() { // wait for the end of examination - we consider 10 min so 10 sec Thread.Sleep(10000); WriteAction("has finished to be examined"); // release the resource Physician Service.SendMessage(new Message(this, EnumMessage.ReleasePhysician)); WaitingResponse.WaitOne(30000); // release the resource ER Service.SendMessage(new Message(this, EnumMessage.ReleaseEmergencyRoom)); WaitingResponse.WaitOne(30000); // Patient leaves Service.SendMessage(new Message(this, EnumMessage.PatientLeaves)); WaitingResponse.WaitOne(); WriteAction("leaves the hospital"); }
private void DonateRoom() { // Wait before donating Thread.Sleep(15000); // Check if there is still rooms free if (AvailableEmergencyRoom <= 0) { return; } // Give Rooms to ResourceProvider while (AvailableEmergencyRoom > 1) { _provider.SendMessage(new Message(this, EnumMessage.DonateEmergencyRoom)); WaitingResponse.WaitOne(); AvailableEmergencyRoom--; } }
void TimeoutMessage() { foreach (KeyValuePair <BEncodedValue, SendDetails> v in WaitingResponse) { if (Timeout == TimeSpan.Zero || v.Value.SentAt.Elapsed > Timeout) { WaitingResponseTimedOut.Add(v.Value); } } foreach (SendDetails v in WaitingResponseTimedOut) { DhtMessageFactory.UnregisterSend((QueryMessage)v.Message); WaitingResponse.Remove(v.Message.TransactionId); v.CompletionSource?.TrySetResult(new SendQueryEventArgs(v.Node, v.Destination, (QueryMessage)v.Message)); RaiseMessageSent(v.Node, v.Destination, (QueryMessage)v.Message); } WaitingResponseTimedOut.Clear(); }
async Task SendMessages() { for (int i = 0; i < 5 && SendQueue.Count > 0; i++) { SendDetails details = SendQueue.Dequeue(); details.SentAt = ValueStopwatch.StartNew(); if (details.Message is QueryMessage) { WaitingResponse.Add(details.Message.TransactionId, details); } byte[] buffer = details.Message.Encode(); try { Monitor.SendMonitor.AddDelta(buffer.Length); await Listener.SendAsync(buffer, details.Destination); } catch { TimeoutMessage(details); } } }
private void TimeoutMessage() { foreach (var v in WaitingResponse) { if (Timeout == TimeSpan.Zero || v.Value.SentAt.Elapsed > Timeout) { WaitingResponseTimedOut.Add(v.Value); } } foreach (var v in WaitingResponseTimedOut) { DhtMessageFactory.UnregisterSend((QueryMessage)v.Message); WaitingResponse.Remove(v.Message.TransactionId); if (v.CompletionSource != null) { v.CompletionSource.TrySetResult(new SendQueryEventArgs(v.Node, v.Destination, (QueryMessage)v.Message)); } RaiseMessageSent(v.Node, v.Destination, (QueryMessage)v.Message); } WaitingResponseTimedOut.Clear(); }
private void ReceiveMessage() { KeyValuePair <IPEndPoint, DhtMessage> receive = ReceiveQueue.Dequeue(); DhtMessage message = receive.Value; IPEndPoint source = receive.Key; SendDetails query = default(SendDetails); try { Node node = Engine.RoutingTable.FindNode(message.Id); if (node == null) { node = new Node(message.Id, source); Engine.RoutingTable.Add(node); } // If we have received a ResponseMessage corresponding to a query we sent, we should // remove it from our list before handling it as that could cause an exception to be // thrown. if (message is ResponseMessage || message is ErrorMessage) { query = WaitingResponse [message.TransactionId]; WaitingResponse.Remove(message.TransactionId); } node.Seen(); if (message is ResponseMessage response) { response.Handle(Engine, node); if (query.CompletionSource != null) { query.CompletionSource.TrySetResult(new SendQueryEventArgs(node, node.EndPoint, (QueryMessage)query.Message, response)); } RaiseMessageSent(node, node.EndPoint, (QueryMessage)query.Message, response); } else if (message is ErrorMessage error) { if (query.CompletionSource != null) { query.CompletionSource.TrySetResult(new SendQueryEventArgs(node, node.EndPoint, (QueryMessage)query.Message, error)); } RaiseMessageSent(node, node.EndPoint, (QueryMessage)query.Message, error); } } catch (MessageException) { var error = new ErrorMessage(message.TransactionId, ErrorCode.GenericError, "Unexpected error responding to the message"); if (query.CompletionSource != null) { query.CompletionSource.TrySetResult(new SendQueryEventArgs(query.Node, query.Destination, (QueryMessage)query.Message, error)); } } catch (Exception) { var error = new ErrorMessage(message.TransactionId, ErrorCode.GenericError, "Unexpected exception responding to the message"); if (query.CompletionSource != null) { query.CompletionSource.TrySetResult(new SendQueryEventArgs(query.Node, query.Destination, (QueryMessage)query.Message, error)); } EnqueueSend(error, null, source); } }