public bool Enqueue(FabricMessage message) { if (!(Filter?.Invoke(message) ?? true)) { return(false); } Queue.Enqueue(message); return(true); }
/// <summary> /// This helper method signals to the underlying fabric that the message has succeeded or failed. /// </summary> /// <param name="message">The fabric message.</param> /// <param name="success">The message success status.</param> public static void MessageSignal(FabricMessage message, bool success) { if (success) { message.Complete(); } else { message.Abandon(); } }
public void DeadletterEnqueue(FabricMessage message) { if (Deadletter == null) { lock (syncDeadletter) { if (Deadletter == null) { Deadletter = new ConcurrentQueue <FabricMessage>(); } } } Deadletter.Enqueue(message); }
/// <summary> /// This method packs the ServiceMessage in to the FabricMessage format /// for communication through the manual bus. This is used to mimic similar operations in services such as Azure Service Bus. /// </summary> /// <param name="payload">The payload object to convert to a FabricMessage.</param> /// <returns>Returns a FabricMessage object.</returns> public static FabricMessage Pack(TransmissionPayload payload) { ServiceMessage sMessage = payload.Message; FabricMessage bMessage; if (sMessage.Blob == null) { bMessage = new FabricMessage(); } else { bMessage = new FabricMessage(sMessage.Blob); } bMessage.Properties.Add("SecuritySignature", sMessage.SecuritySignature); bMessage.Properties.Add("OriginatorKey", sMessage.OriginatorKey); bMessage.Properties.Add("OriginatorServiceId", sMessage.OriginatorServiceId); bMessage.Properties.Add("OriginatorUTC", sMessage.OriginatorUTC.ToString("s", System.Globalization.CultureInfo.InvariantCulture)); bMessage.Properties.Add("ResponseChannelId", MessagingHelper.ToSafeLower(sMessage.ResponseChannelId)); bMessage.Properties.Add("ResponseChannelPriority", sMessage.ResponseChannelPriority.ToString()); bMessage.Properties.Add("ResponseMessageType", MessagingHelper.ToSafeLower(sMessage.ResponseMessageType)); bMessage.Properties.Add("ResponseActionType", MessagingHelper.ToSafeLower(sMessage.ResponseActionType)); //FIX: Case sensitive pattern match in ServiceBus. bMessage.Properties.Add("ChannelId", MessagingHelper.ToSafeLower(sMessage.ChannelId)); bMessage.Properties.Add("MessageType", MessagingHelper.ToSafeLower(sMessage.MessageType)); bMessage.Properties.Add("ActionType", MessagingHelper.ToSafeLower(sMessage.ActionType)); bMessage.Properties.Add("IsNoop", sMessage.IsNoop ? "1" : "0"); bMessage.Properties.Add("IsReplay", sMessage.IsReplay ? "1" : "0"); bMessage.CorrelationId = sMessage.CorrelationServiceId; bMessage.Properties.Add("ProcessCorrelationKey", sMessage.ProcessCorrelationKey); bMessage.Properties.Add("CorrelationKey", sMessage.CorrelationKey); bMessage.Properties.Add("CorrelationServiceId", MessagingHelper.ToSafeLower(sMessage.CorrelationServiceId)); bMessage.Properties.Add("CorrelationUTC", sMessage.CorrelationUTC.HasValue ? sMessage.CorrelationUTC.Value.ToString("o") : null); bMessage.Properties.Add("DispatcherTransitCount", sMessage.DispatcherTransitCount.ToString()); bMessage.Properties.Add("Status", sMessage.Status); bMessage.Properties.Add("StatusDescription", sMessage.StatusDescription); return(bMessage); }
private void Transmit(ManualFabricConnection conn, FabricMessage message) { if (!Mode.HasValue) { throw new ArgumentException("Mode is not configured."); } QueueHolder queue; switch (Mode.Value) { case CommunicationBridgeMode.RoundRobin: if (mOutgoing.TryGetValue(cnDefault, out queue)) { queue.Enqueue(message); } break; case CommunicationBridgeMode.Broadcast: mOutgoing.Values.AsParallel().ForEach((c) => c.Enqueue(message)); break; } }
private void Complete(string queueName, FabricMessage message, bool success, Guid id) { if (success) { return; } message.DeliveryCount++; QueueHolder queue; if (!mOutgoing.TryGetValue(queueName, out queue)) { return; } if (message.DeliveryCount < RetryAttemptsMax) { queue.Enqueue(message); } else { queue.DeadletterEnqueue(message); } }
public bool TryDeadletterDequeue(out FabricMessage message) { message = null; return(Deadletter?.TryDequeue(out message) ?? false); }
public bool TryDequeue(out FabricMessage message) { return(Queue.TryDequeue(out message)); }
/// <summary> /// This method unpacks the FabricMessage message in to a generic ServiceMessage object /// which can be processed by the service.. /// /// </summary> /// <param name="bMessage">The FabricMessage to convert.</param> /// <returns>Returns a generic ServiceMessage class for processing.</returns> public static ServiceMessage Unpack(FabricMessage bMessage) { var sMessage = new ServiceMessage(); if (bMessage.Properties.ContainsKey("SecuritySignature")) { sMessage.SecuritySignature = bMessage.Properties["SecuritySignature"] as string; } sMessage.EnqueuedTimeUTC = bMessage.EnqueuedTimeUtc; sMessage.OriginatorKey = bMessage.Properties["OriginatorKey"] as string; sMessage.OriginatorServiceId = bMessage.Properties["OriginatorServiceId"] as string; sMessage.OriginatorUTC = DateTime.Parse(bMessage.Properties["OriginatorUTC"]); sMessage.ResponseChannelId = bMessage.Properties["ResponseChannelId"] as string; if (bMessage.Properties.ContainsKey("ResponseMessageType")) { sMessage.ResponseMessageType = bMessage.Properties["ResponseMessageType"] as string; } if (bMessage.Properties.ContainsKey("ResponseActionType")) { sMessage.ResponseActionType = bMessage.Properties["ResponseActionType"] as string; } if (bMessage.Properties.ContainsKey("ResponseChannelPriority")) { string value = bMessage.Properties["ResponseChannelPriority"] as string; int responsePriority; if (string.IsNullOrEmpty(value) || !int.TryParse(value, out responsePriority)) { responsePriority = 0; } sMessage.ResponseChannelPriority = responsePriority; } sMessage.ChannelId = bMessage.Properties["ChannelId"] as string; sMessage.MessageType = bMessage.Properties["MessageType"] as string; sMessage.ActionType = bMessage.Properties["ActionType"] as string; sMessage.IsNoop = bMessage.Properties["IsNoop"] as string == "1"; sMessage.IsReplay = bMessage.Properties["IsReplay"] as string == "1"; if (bMessage.Properties.ContainsKey("ProcessCorrelationKey")) { sMessage.ProcessCorrelationKey = bMessage.Properties["ProcessCorrelationKey"] as string; } sMessage.CorrelationKey = bMessage.Properties["CorrelationKey"] as string; sMessage.CorrelationServiceId = bMessage.Properties["CorrelationServiceId"] as string; DateTime serviceUTC; if (bMessage.Properties.ContainsKey("CorrelationUTC") && DateTime.TryParse(bMessage.Properties["CorrelationUTC"] as string, out serviceUTC)) { sMessage.CorrelationUTC = serviceUTC; } sMessage.DispatcherTransitCount = int.Parse(bMessage.Properties["DispatcherTransitCount"]); sMessage.Status = bMessage.Properties["Status"] as string; sMessage.StatusDescription = bMessage.Properties["StatusDescription"] as string; sMessage.Blob = bMessage.Message; sMessage.FabricDeliveryCount = bMessage.DeliveryCount; return(sMessage); }