Exemple #1
0
        /**
         * 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);
        }
Exemple #2
0
        /**
         * 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);
            }
        }
Exemple #4
0
        /**
         * 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");
        }
Exemple #5
0
        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--;
            }
        }
Exemple #6
0
        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();
        }
Exemple #7
0
        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);
                }
            }
        }
Exemple #8
0
        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();
        }
Exemple #9
0
        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);
            }
        }