/// <summary> /// 发布消息到死信队列 /// </summary> /// <param name="queue">死信队列名称</param> /// <param name="body">死信信息</param> /// <param name="type">交换机类型</param> /// <param name="ex">异常</param> /// <returns></returns> private void PublishToDead <T>(string queue, string body, string type, Exception ex) where T : class { var queueInfo = this.GetRabbitMqAttribute <T>(); if (queueInfo == null) { throw new ArgumentException(RabbitMqAttribute); } var deadLetterExchange = queueInfo.ExchangeName; var deadLetterRoutingKey = queueInfo.RoutingKey; string deadLetterQueue = queueInfo.QueueName; var isProperties = queueInfo.IsProperties; var deadLetterBody = new DeadLetterQueue { Body = body, CreateDateTime = DateTime.Now, ExceptionMsg = ex.Message, Queue = queue, RoutingKey = deadLetterRoutingKey, Exchange = deadLetterExchange }; this.Publish(deadLetterExchange, deadLetterQueue, deadLetterRoutingKey, deadLetterBody.TryToJson(), type, isProperties); }
public App(IHostApplicationLifetime host, ILoggerFactory loggerFactory, IServiceProvider services, ProgressTracker progress, ProcessingQueue processingQueue, DeadLetterQueue deadLetterQueue) { _host = host; _services = services; _progress = progress; _logger = loggerFactory.CreateLogger(GetType().FullName); _processingQueue = processingQueue; _deadLetterQueue = deadLetterQueue; _workerTokenSource = new(); }
internal static Bus Build(BusBuilderConfiguration configuration) { var replyQueueName = string.Format("InputQueue.{0}.{1}", configuration.ApplicationName, configuration.InstanceName); var namespaceManager = NamespaceManager.CreateFromConnectionString(configuration.ConnectionString); var messagingFactory = MessagingFactory.CreateFromConnectionString(configuration.ConnectionString); var messagePumps = new List<IMessagePump>(); var queueManager = new QueueManager(namespaceManager, messagingFactory, configuration.MaxDeliveryAttempts); var clock = new SystemClock(); var requestResponseCorrelator = new RequestResponseCorrelator(clock); var messageSenderFactory = new MessageSenderFactory(messagingFactory); var topicClientFactory = new TopicClientFactory(messagingFactory); var commandSender = new BusCommandSender(messageSenderFactory); var requestSender = new BusRequestSender(messageSenderFactory, replyQueueName, requestResponseCorrelator, clock, configuration.DefaultTimeout); var multicastRequestSender = new BusMulticastRequestSender(topicClientFactory, replyQueueName, requestResponseCorrelator, clock); var eventSender = new BusEventSender(topicClientFactory); if (configuration.Debugging.RemoveAllExistingNamespaceElements) { RemoveAllExistingNamespaceElements(namespaceManager); } var queueCreationTasks = new[] { Task.Run(() => CreateMyInputQueue(queueManager, replyQueueName)), Task.Run(() => CreateCommandQueues(configuration, queueManager)), Task.Run(() => CreateRequestQueues(configuration, queueManager)), Task.Run(() => CreateMulticastRequestTopics(configuration, queueManager)), Task.Run(() => CreateEventTopics(configuration, queueManager)), }; Task.WaitAll(queueCreationTasks); //FIXME do these in parallel CreateResponseMessagePump(configuration, messagingFactory, replyQueueName, requestResponseCorrelator, messagePumps); CreateCommandMessagePumps(configuration, messagingFactory, messagePumps); CreateRequestMessagePumps(configuration, messagingFactory, messagePumps); CreateMulticastRequestMessagePumps(configuration, queueManager, messagingFactory, messagePumps); CreateMulticastEventMessagePumps(configuration, queueManager, messagingFactory, messagePumps); CreateCompetingEventMessagePumps(configuration, queueManager, messagingFactory, messagePumps); var commandDeadLetterQueue = new DeadLetterQueue(queueManager); var requestDeadLetterQueue = new DeadLetterQueue(queueManager); var deadLetterQueues = new DeadLetterQueues(commandDeadLetterQueue, requestDeadLetterQueue); var bus = new Bus(commandSender, requestSender, multicastRequestSender, eventSender, messagePumps, deadLetterQueues); return bus; }
internal MsmqBindingElementBase() { this.customDeadLetterQueue = MsmqDefaults.CustomDeadLetterQueue; this.deadLetterQueue = MsmqDefaults.DeadLetterQueue; this.durable = MsmqDefaults.Durable; this.exactlyOnce = MsmqDefaults.ExactlyOnce; this.maxRetryCycles = MsmqDefaults.MaxRetryCycles; this.receiveContextEnabled = MsmqDefaults.ReceiveContextEnabled; this.receiveErrorHandling = MsmqDefaults.ReceiveErrorHandling; this.receiveRetryCount = MsmqDefaults.ReceiveRetryCount; this.retryCycleDelay = MsmqDefaults.RetryCycleDelay; this.timeToLive = MsmqDefaults.TimeToLive; this.msmqTransportSecurity = new MsmqTransportSecurity(); this.useMsmqTracing = MsmqDefaults.UseMsmqTracing; this.useSourceJournal = MsmqDefaults.UseSourceJournal; this.ReceiveContextSettings = new MsmqReceiveContextSettings(); }
internal MsmqBindingElementBase(MsmqBindingElementBase elementToBeCloned) : base(elementToBeCloned) { this.customDeadLetterQueue = elementToBeCloned.customDeadLetterQueue; this.deadLetterQueue = elementToBeCloned.deadLetterQueue; this.durable = elementToBeCloned.durable; this.exactlyOnce = elementToBeCloned.exactlyOnce; this.maxRetryCycles = elementToBeCloned.maxRetryCycles; this.msmqTransportSecurity = new MsmqTransportSecurity(elementToBeCloned.MsmqTransportSecurity); this.receiveContextEnabled = elementToBeCloned.ReceiveContextEnabled; this.receiveErrorHandling = elementToBeCloned.receiveErrorHandling; this.receiveRetryCount = elementToBeCloned.receiveRetryCount; this.retryCycleDelay = elementToBeCloned.retryCycleDelay; this.timeToLive = elementToBeCloned.timeToLive; this.useMsmqTracing = elementToBeCloned.useMsmqTracing; this.useSourceJournal = elementToBeCloned.useSourceJournal; // this.ReceiveContextSettings = elementToBeCloned.ReceiveContextSettings; }
protected MsmqChannelFactoryBase(MsmqBindingElementBase bindingElement, BindingContext context, MessageEncoderFactory encoderFactory) : base(bindingElement, context) { this.addressTranslator = bindingElement.AddressTranslator; this.customDeadLetterQueue = bindingElement.CustomDeadLetterQueue; this.durable = bindingElement.Durable; this.deadLetterQueue = bindingElement.DeadLetterQueue; this.exactlyOnce = bindingElement.ExactlyOnce; this.msmqTransportSecurity = new MsmqTransportSecurity(bindingElement.MsmqTransportSecurity); this.timeToLive = bindingElement.TimeToLive; this.useMsmqTracing = bindingElement.UseMsmqTracing; this.useSourceJournal = bindingElement.UseSourceJournal; if (this.MsmqTransportSecurity.MsmqAuthenticationMode == MsmqAuthenticationMode.Certificate) { InitializeSecurityTokenManager(context); } if (null != this.customDeadLetterQueue) { this.deadLetterQueuePathName = MsmqUri.DeadLetterQueueAddressTranslator.UriToFormatName(this.customDeadLetterQueue); } }
/// <summary> /// 发布消息到死信队列 /// </summary> /// <param name="body">死信信息</param> /// <param name="ex">异常</param> /// <param name="queue">死信队列名称</param> /// <returns></returns> private void PublishToDead <T>(string queue, string body, Exception ex) where T : class { var queueInfo = typeof(T).GetAttribute <RabbitMqAttribute>(); if (queueInfo.IsNull()) { throw new ArgumentException(RabbitMqAttribute); } var deadLetterExchange = queueInfo.ExchangeName; string deadLetterQueue = queueInfo.QueueName; var deadLetterRoutingKey = deadLetterExchange; var deadLetterBody = new DeadLetterQueue { Body = body, CreateDateTime = DateTime.Now, ExceptionMsg = ex.GetInnestException().Message, Queue = queue, RoutingKey = deadLetterExchange, Exchange = deadLetterRoutingKey }; Publish(deadLetterExchange, deadLetterQueue, deadLetterRoutingKey, deadLetterBody.ToJson()); }
public static bool IsDefined(DeadLetterQueue mode) { return(mode >= DeadLetterQueue.None && mode <= DeadLetterQueue.Custom); }
public static bool IsDefined(DeadLetterQueue mode) { return mode >= DeadLetterQueue.None && mode <= DeadLetterQueue.Custom; }
public void DeadLetter() { Queue.Remove(this); DeadLetterQueue.Add(this); }
public static bool IsDefined(DeadLetterQueue mode) { return ((mode >= DeadLetterQueue.None) && (mode <= DeadLetterQueue.Custom)); }
internal static Bus Build(BusBuilderConfiguration configuration) { var logger = configuration.Logger; logger.Debug("Constructing bus..."); var replyQueueName = string.Format("InputQueue.{0}.{1}", configuration.ApplicationName, configuration.InstanceName); var namespaceManager = NamespaceManager.CreateFromConnectionString(configuration.ConnectionString); var versionInfo = namespaceManager.GetVersionInfo(); var messagingFactory = MessagingFactory.CreateFromConnectionString(configuration.ConnectionString); var messagePumps = new List<IMessagePump>(); var queueManager = new QueueManager(namespaceManager, messagingFactory, configuration.MaxDeliveryAttempts, logger); var clock = new SystemClock(); var requestResponseCorrelator = new RequestResponseCorrelator(clock, logger); var messageSenderFactory = new MessageSenderFactory(messagingFactory); var topicClientFactory = new TopicClientFactory(messagingFactory); var commandSender = new BusCommandSender(messageSenderFactory, clock, configuration.CommandTypes); var requestSender = new BusRequestSender(messageSenderFactory, replyQueueName, requestResponseCorrelator, clock, configuration.DefaultTimeout, configuration.RequestTypes, logger); var multicastRequestSender = new BusMulticastRequestSender(topicClientFactory, replyQueueName, requestResponseCorrelator, clock, configuration.RequestTypes); var eventSender = new BusEventSender(topicClientFactory, configuration.EventTypes); if (configuration.Debugging.RemoveAllExistingNamespaceElements) { RemoveAllExistingNamespaceElements(namespaceManager, logger); } logger.Debug("Creating queues and topics"); var queueCreationTasks = new[] { Task.Run(() => CreateMyInputQueue(queueManager, replyQueueName, logger)), Task.Run(() => CreateCommandQueues(configuration, queueManager, logger)), Task.Run(() => CreateRequestQueues(configuration, queueManager, logger)), Task.Run(() => CreateMulticastRequestTopics(configuration, queueManager, logger)), Task.Run(() => CreateEventTopics(configuration, queueManager, logger)) }; Task.WaitAll(queueCreationTasks); logger.Debug("Queues and topics are all created."); logger.Debug("Creating message pumps and subscriptions."); var messagePumpCreationTasks = new[] { Task.Run(() => CreateResponseMessagePump(configuration, messagingFactory, replyQueueName, requestResponseCorrelator, messagePumps, logger)), Task.Run(() => CreateCommandMessagePumps(configuration, messagingFactory, messagePumps, logger)), Task.Run(() => CreateRequestMessagePumps(configuration, messagingFactory, messagePumps, logger)), Task.Run(() => CreateMulticastRequestMessagePumps(configuration, queueManager, messagingFactory, messagePumps, logger)), Task.Run(() => CreateMulticastEventMessagePumps(configuration, queueManager, messagingFactory, messagePumps, logger)), Task.Run(() => CreateCompetingEventMessagePumps(configuration, queueManager, messagingFactory, messagePumps, logger)) }; messagePumpCreationTasks.WaitAll(); logger.Debug("Message pumps and subscriptions are all created."); var commandDeadLetterQueue = new DeadLetterQueue(queueManager); var requestDeadLetterQueue = new DeadLetterQueue(queueManager); var deadLetterQueues = new DeadLetterQueues(commandDeadLetterQueue, requestDeadLetterQueue); var bus = new Bus(commandSender, requestSender, multicastRequestSender, eventSender, messagePumps, deadLetterQueues); logger.Debug("Bus built. Job done!"); return bus; }