public static int GetEstimatedSize(BackplaneMessage msg, bool skipOwner) { // this is only a rough size multiplied by two for getting a roughly sized buffer int size = 2; // two enums if (!skipOwner) { size += msg.OwnerIdentity.Length * 4; } size += msg.Key?.Length * 4 ?? 0; size += msg.Region?.Length * 4 ?? 0; return(size * 2); }
private static void SerializeMessage(MessageWriter writer, BackplaneMessage message, bool skipOwner) { if (!skipOwner) { writer.WriteInt(message.OwnerIdentity.Length); writer.WriteBytes(message.OwnerIdentity); } writer.WriteByte((byte)message.Action); switch (message.Action) { case Changed: writer.WriteByte((byte)message.ChangeAction); if (!string.IsNullOrEmpty(message.Region)) { writer.WriteByte(2); writer.WriteString(message.Region); } else { writer.WriteByte(1); } writer.WriteString(message.Key); break; case Removed: if (!string.IsNullOrEmpty(message.Region)) { writer.WriteByte(2); writer.WriteString(message.Region); } else { writer.WriteByte(1); } writer.WriteString(message.Key); break; case ClearRegion: writer.WriteString(message.Region); break; case Clear: break; } }
private void PublishMessage(BackplaneMessage message) { var msg = message.Serialize(); lock (this.messageLock) { if (message.Action == BackplaneAction.Clear) { Interlocked.Exchange(ref this.skippedMessages, this.messages.Count); this.messages.Clear(); } if (!this.messages.Add(msg)) { Interlocked.Increment(ref this.skippedMessages); if (this.logger.IsEnabled(LogLevel.Trace)) { this.logger.LogTrace("Skipped duplicate message: {0}.", msg); } } this.SendMessages(); } }