private SubscriptionManager GetSubscriptionManager(SubscribeOption subscribe) { var workQueue = new Mock <IQueue>(); workQueue.Setup(m => m.Uri).Returns(new Uri(WorkQueueUri)); var serviceBusConfiguration = new ServiceBusConfiguration { Inbox = new InboxQueueConfiguration { WorkQueue = workQueue.Object } }; var subscriptionConfiguration = SubscriptionSection.Configuration(); subscriptionConfiguration.Subscribe = subscribe; var serviceBusEvents = new ServiceBusEvents(); var subscriptionManager = new SubscriptionManager(serviceBusEvents, serviceBusConfiguration, subscriptionConfiguration, new ScriptProvider(new ScriptProviderConfiguration()), DatabaseContextFactory, DatabaseGateway); serviceBusEvents.OnStarted(this, new PipelineEventEventArgs(new Mock <IPipelineEvent>().Object)); return(subscriptionManager); }
/// <summary> 订阅消息 </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="TH"></typeparam> /// <param name="handler"></param> /// <param name="option"></param> /// <returns></returns> public override Task Subscribe <T, TH>(Func <TH> handler, SubscribeOption option = null) { _consumerChannel = _consumerChannel ?? CreateConsumerChannel(); var opt = (option ?? GetSubscription(typeof(TH))) as RabbitMqSubscribeOption ?? new RabbitMqSubscribeOption(); if (opt.PrefetchCount > 0) { //同时只能接受1条消息 _consumerChannel.BasicQos(0, (ushort)opt.PrefetchCount, false); } var queue = opt.Queue; var dataType = typeof(T); string key; if (typeof(DEvent).IsAssignableFrom(dataType)) { key = !string.IsNullOrWhiteSpace(opt.RouteKey) ? opt.RouteKey : typeof(T).GetRouteKey(); } else { key = string.IsNullOrWhiteSpace(opt.RouteKey) ? opt.Queue : opt.RouteKey; } DeclareAndBindQueue(queue, key, opt); if (!_connection.IsConnected) { _connection.TryConnect(); } var consumer = new EventingBasicConsumer(_consumerChannel); consumer.Received += async(model, ea) => { try { await ReceiveMessage(queue, ea, opt); } catch (Exception ex) { _logger.LogError(ex, $"MQ订阅处理异常:{ex.Message}"); } }; _consumerChannel.BasicConsume(queue, false, consumer); SubscriptionManager.AddSubscription <T, TH>(handler, queue); return(Task.CompletedTask); }
public abstract Task Subscribe <T, TH>(Func <TH> handler, SubscribeOption option = null) where TH : IEventHandler <T>;