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