Ejemplo n.º 1
0
        /// <summary>
        /// 默认消息处理器
        /// </summary>
        /// <param name="subscriber">订阅者</param>
        /// <param name="messageHandlerProvider">消息处理器提供者</param>
        /// <param name="mailboxProvider">Mailbox提供者</param>
        /// <param name="continueWhenHandleFail">相同BusinessKey的消息处理失败后,是否继续推进</param>
        /// <param name="retryIntervalSeconds">重试间隔秒数(-1 表示不重试)</param>
        /// <param name="mailboxEliminationStrategy">mailbox淘汰策略,默认为LFU</param>
        /// <param name="mailboxTimeoutSeconds">mailbox超时秒数</param>
        /// <param name="cleanInactiveMailboxIntervalSeconds">清理不活跃邮箱间隔秒数</param>
        /// <param name="batchSize">批量处理大小</param>
        public DefaultMessageProcessor(
            string subscriber,
            IMessageHandlerProvider messageHandlerProvider,
            IProcessingMessageMailboxProvider mailboxProvider,
            bool continueWhenHandleFail,
            int retryIntervalSeconds,
            IEliminationStrategy mailboxEliminationStrategy = null,
            int mailboxTimeoutSeconds = 600,
            int cleanInactiveMailboxIntervalSeconds = 10,
            int batchSize = 1000)
        {
            if (messageHandlerProvider == null)
            {
                throw new ArgumentNullException(nameof(messageHandlerProvider));
            }
            if (mailboxProvider == null)
            {
                throw new ArgumentNullException(nameof(mailboxProvider));
            }
            _mailboxDict = new ConcurrentDictionary <string, IProcessingMessageMailbox>();
            _logger      = LoggerManager.GetLogger(GetType());
            _cleanInactiveMailboxTimer = new Timer(CleanInactiveMailbox);

            _subscriber                          = subscriber;
            _messageHandlerProvider              = messageHandlerProvider;
            _mailboxProvider                     = mailboxProvider;
            _mailboxEliminationStrategy          = mailboxEliminationStrategy ?? new LfuStrategy();
            _eliminationKeyDict                  = new ConcurrentDictionary <string, bool>();
            _continueWhenHandleFail              = continueWhenHandleFail;
            _retryIntervalSeconds                = retryIntervalSeconds;
            _mailboxTimeoutSeconds               = mailboxTimeoutSeconds;
            _cleanInactiveMailboxIntervalSeconds = cleanInactiveMailboxIntervalSeconds;
            _batchSize = batchSize;

            _mailboxEliminationStrategy.OnKnockedOut += (sender, e) =>
            {
                foreach (var key in e.Keys)
                {
                    _eliminationKeyDict.TryAdd(key, false);
                }
            };
        }
 public CommandConsumer()
 {
     _mailboxProvider = new DefaultProcessingMessageMailboxProvider(new DefaultProcessingMessageHandler());
     _logger          = LoggerManager.GetLogger(typeof(CommandConsumer));
 }