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);
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
 public abstract Task Subscribe <T, TH>(Func <TH> handler, SubscribeOption option = null)
     where TH : IEventHandler <T>;