/// <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)); }