Exemplo n.º 1
0
        public void Ping(object stateInfo)
        {
            if (WebSocket != null)
            {
                Task.Run(async() =>
                {
                    try
                    {
                        if (WebSocket.State == WebSocketState.Open)
                        {
                            await WebsocketSendingSemaphore.WaitAsync();
                            try
                            {
                                await JsonStreaming.Send(WebSocket, new QueueControlMessage
                                {
                                    Type    = QueueControlMessage.QueueControlMessageTypes.Ping,
                                    Queue   = QueueName,
                                    Message = new QueueMessage()
                                });
                            }
                            finally
                            {
                                WebsocketSendingSemaphore.Release();
                            }
                        }

                        if (!this.IsExecuting &&
                            this.LastPing != null &&
                            DateTime.Now.Subtract(this.LastPing.Value).TotalMilliseconds > PING_TIMEOUT_THRESHOLD
                            )
                        {
                            Connection.Logger.LogWarning("Ping timeout, closing");
                            //Console.WriteLine("Ping timeout, closing");
                            await this.Close();
                        }
                    }
                    catch (Exception)
                    {
                        //Console.WriteLine("Exception in ping handler: " + e);
                    }
                });
            }
        }
Exemplo n.º 2
0
        public async Task Ack(QueueMessage message, bool success)
        {
            await WebsocketSendingSemaphore.WaitAsync();

            try
            {
                await JsonStreaming.Send(WebSocket, new QueueControlMessage
                {
                    Type = success
                    ? QueueControlMessage.QueueControlMessageTypes.Ack
                    : QueueControlMessage.QueueControlMessageTypes.Nak,
                    Message = message,
                    Queue   = QueueName
                });
            }
            finally
            {
                WebsocketSendingSemaphore.Release();
            }
        }
Exemplo n.º 3
0
        public async Task ListenAsync(
            Func <QueueMessage, Task> onMessage,
            Func <Task> onConnected             = null,
            CancellationToken cancellationToken = default(CancellationToken)
            )
        {
            await JsonStreaming.Receive <QueueControlMessage>(WebSocket, async m =>
            {
                switch (m?.Type)
                {
                case QueueControlMessage.QueueControlMessageTypes.Connected:
                    if (onConnected != null)
                    {
                        await onConnected();
                    }
                    break;

                case QueueControlMessage.QueueControlMessageTypes.Incoming:
                    IsExecuting = true;

                    await onMessage(m.Message);

                    this.LastPing = DateTime.Now;
                    IsExecuting   = false;
                    break;

                case QueueControlMessage.QueueControlMessageTypes.Ping:
                    Connection.Logger.LogDebug("Ping Received");
                    if (DateTime.Now.Subtract(this.LastPing.Value).TotalMilliseconds > PING_TIMEOUT_THRESHOLD)
                    {
                        Connection.Logger.LogDebug("Ping Received, late. socket thread is blocked.");
                    }

                    this.LastPing = DateTime.Now;
                    break;
                }
            }, cancellationToken);

            //Console.WriteLine("Receive has returned");
        }