protected void NtfyMessage(ScalableMessage message) { if (message.From == ID) { CompleteMessage(message); } else { onMessageReceived?.Invoke(message); } }
public override async Task SendMessage(ScalableMessage msg) { await initTask; List <TableRow> servers = new List <TableRow>(); await db["__queues"].RangeRetrieve(name, nameEnd, _servers => { lock (servers) { servers.AddRange(_servers); } return(true); }); byte[] buffy = new byte[1 + 16 + 16 + 4 + msg.Message.Length]; buffy[0] = 4; Buffer.BlockCopy(id.ToByteArray(), 0, buffy, 1, 16); Buffer.BlockCopy(msg.ID.ToByteArray(), 0, buffy, 1 + 16, 16); Buffer.BlockCopy(BitConverter.GetBytes(msg.Message.Length), 0, buffy, 1 + 16 + 16, 4); Buffer.BlockCopy(msg.Message, 0, buffy, 1 + 16 + 16 + 4, msg.Message.Length); foreach (TableRow boat in servers) { await mclient.SendAsync(buffy, buffy.Length, boat["Hostname"] as string, (int)boat["port"]); } var tsktsktsktsk = new TaskCompletionSource <bool>(); lock (pendingMessages) { pendingMessages.Add(msg.ID, tsktsktsktsk); } await Task.WhenAny(tsktsktsktsk.Task, Task.Delay(timeout)); lock (pendingMessages) { pendingMessages.Remove(msg.ID); } if (!tsktsktsktsk.Task.IsCompleted) { } }
/// <summary> /// Sends a message to all members of the queue. /// </summary> /// <param name="msg"></param> /// <returns></returns> public abstract Task SendMessage(ScalableMessage msg);
/// <summary> /// Notifies the cluster that a message has been successfully processed. /// </summary> /// <param name="message"></param> public abstract Task CompleteMessage(ScalableMessage message);
public override async Task CompleteMessage(ScalableMessage message) { throw new NotImplementedException(); }