Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
 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();
 }
Exemplo n.º 3
0
        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;
        }
Exemplo n.º 4
0
 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();
 }
Exemplo n.º 5
0
        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;
        }
Exemplo n.º 6
0
        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);
            }
        }
Exemplo n.º 7
0
        /// <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());
        }
Exemplo n.º 8
0
 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;
 }
Exemplo n.º 10
0
 public void DeadLetter()
 {
     Queue.Remove(this);
     DeadLetterQueue.Add(this);
 }
 public static bool IsDefined(DeadLetterQueue mode)
 {
     return ((mode >= DeadLetterQueue.None) && (mode <= DeadLetterQueue.Custom));
 }
Exemplo n.º 12
0
        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;
        }