예제 #1
0
        public void Send_Receive_Message()
        {
            using (IBus bus = new RabbitMQBus())
            {
                using (IChannelFactory <ITestContract> channelFactory = new MessageBus.Core.Proxy.ChannelFactory <ITestContract>(bus))
                {
                    ISubscriptionFactory <ITestContract> subscriptionFactory = new SubscriptionFactory <ITestContract>(bus, c => c.SetReceiveSelfPublish());

                    string           actual = "";
                    ManualResetEvent ev     = new ManualResetEvent(false);

                    using (ISubscriptionSelector <ITestContract> selector = subscriptionFactory.Subscribe())
                    {
                        selector.Subscribe <string>(contract => contract.Foo, s =>
                        {
                            actual = s;

                            ev.Set();
                        });


                        ITestContract channel = channelFactory.CreateChannel();

                        channel.Foo("boo");

                        ev.WaitOne(TimeSpan.FromSeconds(5));

                        actual.Should().Be("boo");
                    }
                }
            }
        }
예제 #2
0
 public EasyNetQSubscriber(IErrorHandlingStrategy errorHandlingStrategy, IAdvancedBus bus, IQueue queue, ushort prefetchcount,
                           ISubscriptionSelector subscriptionSelector, ISuccessHandlingStrategy successHandlingStrategy, IDisposable nameHandle)
 {
     _errorHandlingStrategy   = errorHandlingStrategy;
     _successHandlingStrategy = successHandlingStrategy;
     _bus                  = bus;
     _queue                = queue;
     _prefetchcount        = prefetchcount;
     _subscriptionSelector = subscriptionSelector;
     _nameHandle           = nameHandle;
 }
예제 #3
0
        public void Send_Receive_CustomSerializationMessage()
        {
            using (IBus bus = new RabbitMQBus())
            {
                using (IChannelFactory <ITestContract> channelFactory = new MessageBus.Core.Proxy.ChannelFactory <ITestContract>(bus, c => c.UseJsonSerializerSettings(new JsonSerializerSettings
                {
                    TypeNameHandling = TypeNameHandling.Auto
                })))
                {
                    ISubscriptionFactory <ITestContract> subscriptionFactory = new SubscriptionFactory <ITestContract>(bus);

                    Data             actual = null;
                    ManualResetEvent ev     = new ManualResetEvent(false);

                    Data data = new Data
                    {
                        Value = "boo"
                    };

                    using (ISubscriptionSelector <ITestContract> selector = subscriptionFactory.Subscribe(c => c.SetReceiveSelfPublish().UseJsonSerializerSettings(new JsonSerializerSettings
                    {
                        TypeNameHandling = TypeNameHandling.Auto
                    })))
                    {
                        selector.Subscribe <Data>(contract => contract.Foo, s =>
                        {
                            actual = s;

                            ev.Set();
                        });


                        ITestContract channel = channelFactory.CreateChannel();

                        channel.Foo(data);

                        ev.WaitOne(TimeSpan.FromSeconds(5));

                        actual.ShouldBeEquivalentTo(data);
                    }
                }
            }
        }
예제 #4
0
 public async Task <ISubscriber> CreateSubscriberAsync(string name, IEnumerable <string> routings, int retrycount, int prefetchcount,
                                                       bool explicitAcknowledgments, ISubscriptionSelector subscriptionSelector)
 {
     return(await CreateSubscriberAsync(name, false, null, routings, retrycount, prefetchcount,
                                        explicitAcknowledgments, subscriptionSelector, true));
 }
예제 #5
0
 public async Task <ISubscriber> CreateSubscriberAsync(string name, IEnumerable <string> routings,
                                                       int retrycount, int prefetchcount, ISubscriptionSelector subscriptionSelector, bool storedeadletter)
 {
     return(await CreateSubscriberAsync(name, false, null, routings,
                                        retrycount, prefetchcount, false, new DefaultSubscriptionSelector(), storedeadletter));
 }
예제 #6
0
        private async Task <ISubscriber> CreateSubscriberAsync(string name, bool temporary, Action temporaryQueueDisconnected,
                                                               IEnumerable <string> routings, int retrycount, int prefetchcount, bool explicitAcknowledgments, ISubscriptionSelector subscriptionSelector, bool storedeadletter)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentException("name argument can not be null or empty");
            }

            if ((routings != null) && (routings.Any(routing => string.IsNullOrEmpty(routing)) || !routings.Any()))
            {
                throw new ArgumentException("routings argument can not be empty or contain empty strings");
            }

            if (retrycount < 0)
            {
                throw new ArgumentException("retrycount argument can not be less than zero");
            }

            if (temporaryQueueDisconnected != null)
            {
                _broker.RegisterDisconnectedAction(temporaryQueueDisconnected);
            }

            //Main subscriber queue and bindings
            var queue = await _bus.QueueDeclareAsync(
                _environmentNamingConventionController.GetQueueName(name), false, true, temporary);

            if (routings != null)
            {
                foreach (var routing in routings)
                {
                    await _bus.BindAsync(await _exchange, queue, routing);
                }
            }

            //Retry subscriber queue and bindings
            for (int i = 1; i <= retrycount; i++)
            {
                var retryqueueroutingkey = _environmentNamingConventionController.GetRetryRoutingKey(name, i);
                var retryqueuequeuename  = _environmentNamingConventionController.GetRetryQueueName(name, i);
                var queueretrybinding    = await _bus.BindAsync(await _exchange, queue,
                                                                retryqueueroutingkey);

                var retryqueue = await _bus.QueueDeclareAsync(retryqueuequeuename,
                                                              false, true, temporary, false, _retryfactor *i, null, null, (await _exchange).Name);

                var retryqueuebinding =
                    await _bus.BindAsync(_easyNetQPublisherToWaitExchange.Exchange,
                                         retryqueue, retryqueueroutingkey);
            }



            //Dead letter subscriber queue and bindings
            if (storedeadletter)
            {
                var deadletterqueueroutingkey = _environmentNamingConventionController
                                                .GetDeadLetterQueueRoutingKey(name);
                var deadletterqueuequeuename = _environmentNamingConventionController.
                                               GetDeadLetterQueueName(name);
                var deadletterqueue = await _bus.QueueDeclareAsync(deadletterqueuequeuename, false, true, temporary);

                var deadletterqueuebinding = await
                                             _bus.BindAsync(_easyNetQPublisherToWaitExchange.Exchange, deadletterqueue,
                                                            deadletterqueueroutingkey);
            }

            //Direct Routing Key binding
            var directroutingkey             = _environmentNamingConventionController.GetDirectRoutingKey(name);
            var queuedirectroutingkeybinding = await _bus.BindAsync(await _exchange, queue,
                                                                    directroutingkey);


            if (_subscriberController.RegisterSubscriberName(name, out IDisposable nameHandle))
            {
                var executionHandler = new ExecutionHandlingStrategy(name, _easyNetQPublisherToWaitExchange,
                                                                     retrycount, _environmentNamingConventionController, explicitAcknowledgments, _publisher, storedeadletter);
                return(new EasyNetQSubscriber(executionHandler, _bus, queue, (ushort)prefetchcount,
                                              subscriptionSelector, executionHandler, nameHandle));
            }
            else
            {
                throw new SubscriberAlreadyExistsException($"The subscriber " +
                                                           $"with name {name}" +
                                                           $" already exists");
            }
        }
예제 #7
0
 public async Task <ISubscriber> CreateSubscriberAsync(string name, Action temporaryQueueDisconnected, IEnumerable <string> routings,
                                                       int retrycount, bool storedeadletter, int prefetchcount, bool explicitAcknowledgments, ISubscriptionSelector subscriptionSelector)
 {
     return(await CreateSubscriberAsync(name, true, temporaryQueueDisconnected, routings,
                                        retrycount, prefetchcount, explicitAcknowledgments, new DefaultSubscriptionSelector(), storedeadletter));
 }
예제 #8
0
 public async Task <ISubscriber> CreateSubscriberAsync(string name, Action temporaryQueueDisconnected, IEnumerable <string> routings,
                                                       int retrycount, int prefetchcount, ISubscriptionSelector subscriptionSelector)
 {
     return(await CreateSubscriberAsync(name, true, temporaryQueueDisconnected, routings,
                                        retrycount, prefetchcount, false, new DefaultSubscriptionSelector(), true));
 }
예제 #9
0
 public async Task <ISubscriber> CreateSubscriberAsync(string name, bool temporary, IEnumerable <string> routings,
                                                       int retrycount, int prefetchcount, bool explicitAcknowledgments, ISubscriptionSelector subscriptionSelector, bool storedeadletter)
 {
     return(await CreateSubscriberAsync(name, temporary, null, routings,
                                        retrycount, prefetchcount, explicitAcknowledgments, subscriptionSelector, storedeadletter));
 }