public static IAsbOptions UseAzureServiceBusInOneWayClientMode(this RebusTransportConfigurer configurer,
                                                                       string connectionString)
        {
            IAsbOptions asbOptionsToReturn;

            if (ShouldEmulateAzureEnvironment(connectionString))
            {
                var sender = MsmqMessageQueue.Sender();
                configurer.UseSender(sender);
                asbOptionsToReturn = new NoopAsbOptions();
            }
            else
            {
                var sender = AzureServiceBusMessageQueue.Sender(connectionString);
                configurer.UseSender(sender);
                asbOptionsToReturn = new AsbOptions(sender);
            }

            var gag = new OneWayClientGag();

            configurer.UseReceiver(gag);
            configurer.UseErrorTracker(gag);

            return(asbOptionsToReturn);
        }
Exemple #2
0
        public Tuple <ISendMessages, IReceiveMessages> GetQueue(string inputQueueName)
        {
            var messageQueue = new MsmqMessageQueue(inputQueueName).PurgeInputQueue();

            disposables.Add(messageQueue);
            return(new Tuple <ISendMessages, IReceiveMessages>(messageQueue, messageQueue));
        }
        public void WorksWhenMovingToErrorQueue()
        {
            using (var messageQueue = new MsmqMessageQueue("error"))
            {
                // make sure error queue is empty
                messageQueue.PurgeInputQueue();

                adapter.Handle <Request>(req =>
                {
                    throw new ApplicationException("oh crap");
                });

                var request = new Request();
                bus.AttachHeader(request, Headers.CorrelationId, "super-unique!!!!111");
                bus.SendLocal(request);

                // let it fail
                Thread.Sleep(2.Seconds());

                var receivedTransportMessage = messageQueue.ReceiveMessage(new NoTransaction());
                receivedTransportMessage.ShouldNotBe(null);

                var serializer = new JsonMessageSerializer();
                var message    = serializer.Deserialize(receivedTransportMessage);

                message.Headers.ShouldContainKeyAndValue(Headers.CorrelationId, "super-unique!!!!111");
            }
        }
Exemple #4
0
 static void PurgeInputQueue(string inputQueueName)
 {
     using (var queue = new MsmqMessageQueue(inputQueueName))
     {
         queue.PurgeInputQueue();
     }
 }
        public void DoesNotLeakMessages()
        {
            // arrange
            const string inputQueueName = "test.leak.input";
            var          queue          = new MsmqMessageQueue(inputQueueName);

            disposables.Add(queue);

            var body    = Encoding.UTF8.GetBytes(new string('*', 32768));
            var message = new TransportMessageToSend
            {
                Headers = new Dictionary <string, object> {
                    { Headers.MessageId, "msg-1" }
                },
                Body = body
            };

            var weakMessageRef = new WeakReference(message);
            var weakBodyRef    = new WeakReference(body);


            // act
            queue.Send(inputQueueName, message, new NoTransaction());
            message = null;
            body    = null;

            GC.Collect();
            GC.WaitForPendingFinalizers();

            // assert
            Assert.That(weakMessageRef.IsAlive, Is.False, "Expected the message to have been collected");
            Assert.That(weakBodyRef.IsAlive, Is.False, "Expected the body bytes to have been collected");
        }
        MsmqMessageQueue GetQueue(string queueName)
        {
            var queue = new MsmqMessageQueue(queueName).PurgeInputQueue();

            disposables.Add(queue);

            return(queue);
        }
Exemple #7
0
 /// <summary>
 /// Dispose pattern.
 /// </summary>
 /// <param name="isDisposing">Invoked from Dispose().</param>
 protected virtual void Dispose(bool isDisposing)
 {
     if (_queue != null)
     {
         _queue.Dispose();
         _queue = null;
     }
 }
            public LoadBalancerWorker(MsmqMessageQueue queue, int workerNumber, Func <string> getNextDestination)
            {
                this.queue              = queue;
                this.workerNumber       = workerNumber;
                this.getNextDestination = getNextDestination;
                workerThread            = new Thread(DoWork);

                log.Info("Starting load balancer worker {0}", workerNumber);
                workerThread.Start();
            }
 void StartWorker()
 {
     using (var messageQueue = new MsmqMessageQueue(listenQueue))
     {
         while (keepRunning)
         {
             DoWork(messageQueue);
         }
     }
 }
Exemple #10
0
        public void SendMsmqMessageToUnknownRemoteQueue()
        {
            var sender = MsmqMessageQueue.Sender();

            sender.Send("nonexistingQueue@DACAPPL03", new TransportMessageToSend
            {
                Label   = "unknown host",
                Headers = new Dictionary <string, object>(),
                Body    = Encoding.UTF8.GetBytes("muahahahahahahaha"),
            }, new NoTransaction());
        }
Exemple #11
0
        public AnalyticsRepository(AnalysisDbContext dbContext, ConfigurationStore configurationStore)
        {
            _unitOfWork = dbContext?.UnitOfWork ?? throw new ArgumentNullException(nameof(dbContext));

            var settings = configurationStore.Load <MessageQueueSettings>();

            if (settings != null && !settings.UseSql)
            {
                _queue = new MsmqMessageQueue(settings.ReportQueue, settings.ReportAuthentication,
                                              settings.ReportTransactions);
            }
        }
Exemple #12
0
        protected override void DoSetUp()
        {
            serializer  = new JsonMessageSerializer();
            senderQueue = new MsmqMessageQueue(SenderQueueName);

            destinationQueue = NewRawMsmqQueue(DestinationQueueName);

            senderQueue.PurgeInputQueue();
            destinationQueue.Purge();

            TrackDisposable(senderQueue);
        }
Exemple #13
0
        static List <ReceivedTransportMessage> GetAllTheMessages(MsmqMessageQueue msmqMessageQueue, ITransactionContext transactionContext)
        {
            var messages = new List <ReceivedTransportMessage>();
            ReceivedTransportMessage transportMessage;

            while ((transportMessage = msmqMessageQueue.ReceiveMessage(transactionContext)) != null)
            {
                messages.Add(transportMessage);
            }

            return(messages);
        }
Exemple #14
0
        public AnalyticsRepository(IAdoNetUnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;

            var settings = ConfigurationStore.Instance.Load <MessageQueueSettings>();

            if (settings != null && !settings.UseSql)
            {
                _queue = new MsmqMessageQueue(settings.ReportQueue, settings.ReportAuthentication,
                                              settings.ReportTransactions);
            }
        }
        protected RebusBus CreateBus(string inputQueueName, IActivateHandlers activateHandlers, IStoreSubscriptions storeSubscriptions, IStoreSagaData storeSagaData, string errorQueueName)
        {
            var messageQueue = new MsmqMessageQueue(inputQueueName).PurgeInputQueue();

            MsmqUtil.PurgeQueue(errorQueueName);
            serializer = new JsonMessageSerializer();
            var bus = new RebusBus(activateHandlers, messageQueue, messageQueue,
                                   storeSubscriptions, storeSagaData,
                                   this, serializer, pipelineInspector,
                                   new ErrorTracker(errorQueueName));

            EnsureProperDisposal(bus);
            EnsureProperDisposal(messageQueue);

            return(bus);
        }
Exemple #16
0
        public void SetUp()
        {
            disposables = new List <IDisposable>();

            serializer           = new JsonMessageSerializer();
            senderQueue          = new MsmqMessageQueue("test.msmq.tx.sender");
            destinationQueueName = "test.msmq.tx.destination";

            destinationQueue = NewRawMsmqQueue(destinationQueueName);

            senderQueue.PurgeInputQueue();
            destinationQueue.Purge();

            disposables.Add(senderQueue);
            disposables.Add(destinationQueue);
        }
        public LoadBalancerService Start()
        {
            if (!destinationQueueNames.Any())
            {
                throw new InvalidOperationException("Cannot start load balancer without adding at least one worker input queue!");
            }

            log.Info("Starting load balancer");

            queue = new MsmqMessageQueue(inputQueueName);

            workers.AddRange(Enumerable.Range(1, numberOfWorkers)
                             .Select(i => new LoadBalancerWorker(queue, i, GetNextDestination)));

            return(this);
        }
Exemple #18
0
        private string SendMessageImpl(object message, string correlationId, TimeSpan timeToBeReceived)
        {
            var transactionOptions = new TransactionOptions {
                IsolationLevel = IsolationLevel.ReadCommitted
            };
            var transactionScope = !IsTransactional
                ? null
                : new TransactionScope(TransactionScopeOption.Required, transactionOptions);

            using (transactionScope)
            {
                try
                {
                    var msg = new Message {
                        Body = message, TimeToBeReceived = timeToBeReceived
                    };

                    if (!string.IsNullOrEmpty(correlationId))
                    {
                        msg.CorrelationId = correlationId;
                    }

                    MsmqMessageQueue.Send(
                        msg,
                        IsTransactional ? MessageQueueTransactionType.Automatic : MessageQueueTransactionType.None);
                    lock (Synch)
                    {
                        AddMessageAudit(msg);
                    }

                    Logger.DebugFormat("Sent message to [{0}]...", QueueName);
                    if (transactionScope != null)
                    {
                        transactionScope.Complete();
                    }

                    return(msg.Id);
                }
                catch (Exception ex)
                {
                    Logger.ErrorFormat(ex, "Exception encountered by [{0}] sending Message [{1}].", this, message);
                    throw;
                }
            }
        }
Exemple #19
0
        public static void UseAzureServiceBusInOneWayClientMode(this RebusTransportConfigurer configurer,
                                                                string connectionString)
        {
            if (ShouldEmulateAzureEnvironment(connectionString))
            {
                var sender = MsmqMessageQueue.Sender();
                configurer.UseSender(sender);
            }
            else
            {
                var sender = AzureServiceBusMessageQueue.Sender(connectionString);
                configurer.UseSender(sender);
            }

            var gag = new OneWayClientGag();

            configurer.UseReceiver(gag);
            configurer.UseErrorTracker(gag);
        }
        protected override void DoSetUp()
        {
            DropCollection("sagas");

            var msmqMessageQueue = new MsmqMessageQueue("test.dispatcher.and.mongo");

            handlers = new HandlerActivatorForTesting().UseHandler(new MySaga());

            var persister = new MongoDbSagaPersister(ConnectionString)
                            .SetCollectionName <MySagaData>("sagas");

            bus = new RebusBus(handlers, msmqMessageQueue,
                               msmqMessageQueue, new InMemorySubscriptionStorage(),
                               persister,
                               null,
                               new JsonMessageSerializer(),
                               new TrivialPipelineInspector(),
                               new ErrorTracker("error"))
                  .Start(1);
        }
Exemple #21
0
        public void CheckSendPerformance(int count)
        {
            var queue = new MsmqMessageQueue("test.msmq.performance").PurgeInputQueue();

            TrackDisposable(queue);

            var transportMessageToSend = new TransportMessageToSend
            {
                Headers = new Dictionary <string, object>(),
                Body    = new byte[1024],
                Label   = "this is just a label"
            };

            var stopwatch = Stopwatch.StartNew();

            count.Times(() => queue.Send("test.msmq.performance", transportMessageToSend, new NoTransaction()));
            var totalSeconds = stopwatch.Elapsed.TotalSeconds;

            Console.WriteLine("Sending {0} messages took {1:0} s - that's {2:0} msg/s",
                              count, totalSeconds, count / totalSeconds);
        }
Exemple #22
0
        public void CanSendAndReceiveMessageToQueueOnLocalhost()
        {
            // arrange
            var queue = new MsmqMessageQueue("test.msmq.loca.input").PurgeInputQueue();

            TrackDisposable(queue);

            const string localHostQualifiedQueueName = "test.msmq.loca.input@localhost";

            // act
            queue.Send(localHostQualifiedQueueName, new TransportMessageToSend {
                Body = Encoding.UTF8.GetBytes("yo dawg!")
            }, new NoTransaction());

            Thread.Sleep(200);

            // assert
            var receivedTransportMessage = queue.ReceiveMessage(new NoTransaction());

            receivedTransportMessage.ShouldNotBe(null);
            Encoding.UTF8.GetString(receivedTransportMessage.Body).ShouldBe("yo dawg!");
        }
Exemple #23
0
        public void CanSendAndReceiveMessageToQueueOnSpecificMachine()
        {
            // arrange
            var queue = new MsmqMessageQueue("test.msmq.mach.input").PurgeInputQueue();

            TrackDisposable(queue);

            var machineQualifiedQueueName = "test.msmq.mach.input@" + Environment.MachineName;

            // act
            queue.Send(machineQualifiedQueueName, new TransportMessageToSend {
                Body = Encoding.UTF8.GetBytes("yo dawg!")
            }, new NoTransaction());

            Thread.Sleep(200);

            // assert
            var receivedTransportMessage = queue.ReceiveMessage(new NoTransaction());

            receivedTransportMessage.ShouldNotBe(null);
            Encoding.UTF8.GetString(receivedTransportMessage.Body).ShouldBe("yo dawg!");
        }
        public void Setup()
        {
            if (MessageQueue.Exists(queueId))
            {
                MessageQueue.Delete(queueId);
            }

            //var acl = new System.Messaging.AccessControlList {
            //    new System.Messaging.AccessControlEntry(
            //    new System.Messaging.Trustee(Environment.UserName, Environment.MachineName),
            //    System.Messaging.GenericAccessRights.All,
            //    System.Messaging.StandardAccessRights.All,
            //    System.Messaging.AccessControlEntryType.Allow)
            //};

            _sut = new MsmqMessageQueue(new QueueCreationOptions {
                QueueId   = queueId,
                QueueName = "AnyQ.Queues.Msmq Test Queue"
            }, false);

            _backingQueue = new MessageQueue(queueId);
        }
Exemple #25
0
        void HandlePost(HttpListenerResponse response, HttpListenerRequest request)
        {
            using (var reader = new BinaryReader(request.InputStream))
            {
                var receivedTransportMessage = new ReceivedTransportMessage
                {
                    Id   = request.Headers[RebusHttpHeaders.Id],
                    Body = reader.ReadBytes((int)request.ContentLength64)
                };

                var headers = new Dictionary <string, string>();

                foreach (var rebusHeaderKey in request.Headers.AllKeys.Where(k => k.StartsWith(RebusHttpHeaders.CustomHeaderPrefix)))
                {
                    var value = request.Headers[rebusHeaderKey];
                    var key   = rebusHeaderKey.Substring(RebusHttpHeaders.CustomHeaderPrefix.Length);

                    headers.Add(key, value);
                }

                log.Info("Got headers in request: {0}", string.Join(", ", headers.Keys));

                receivedTransportMessage.Headers = headers;

                log.Info("Received message {0}", receivedTransportMessage.Id);

                using (var queue = MsmqMessageQueue.Sender())
                {
                    queue.Send(destinationQueue, receivedTransportMessage.ToForwardableMessage());
                }

                log.Info("Message was sent to {0}", destinationQueue);

                response.StatusCode = (int)HttpStatusCode.OK;
                response.Close();
            }
        }
Exemple #26
0
        public void CanSendAndReceiveMessageToQueueOnMachineSpecifiedByIp()
        {
            var ipAddress = GuessOwnIpAddress();

            // arrange
            var queue = new MsmqMessageQueue("test.msmq.ip.input").PurgeInputQueue();

            TrackDisposable(queue);

            var ipQualifiedName = "test.msmq.ip.input@" + ipAddress;

            // act
            queue.Send(ipQualifiedName, new TransportMessageToSend {
                Body = Encoding.UTF8.GetBytes("yo dawg!")
            }, new NoTransaction());

            Thread.Sleep(1.Seconds());

            // assert
            var receivedTransportMessage = queue.ReceiveMessage(new NoTransaction());

            receivedTransportMessage.ShouldNotBe(null);
            Encoding.UTF8.GetString(receivedTransportMessage.Body).ShouldBe("yo dawg!");
        }
Exemple #27
0
        public TimeoutService(IStoreTimeouts storeTimeouts, string inputQueueName, string errorQueueName)
        {
            var msmqMessageQueue = new MsmqMessageQueue(inputQueueName);

            Initialize(storeTimeouts, msmqMessageQueue, msmqMessageQueue, errorQueueName);
        }
Exemple #28
0
        public TimeoutService(IStoreTimeouts storeTimeouts)
        {
            var msmqMessageQueue = new MsmqMessageQueue(DefaultInputQueueName);

            Initialize(storeTimeouts, msmqMessageQueue, msmqMessageQueue, DefaultErrorQueueName);
        }
Exemple #29
0
        static void Run(Parameters parameters)
        {
            if (string.IsNullOrWhiteSpace(parameters.ErrorQueueName))
            {
                throw new NiceException("Please specify the name of an error queue");
            }

            using (var tx = new TransactionScope())
            {
                var transactionContext = new AmbientTransactionContext();

                if (!MessageQueue.Exists(MsmqUtil.GetPath(parameters.ErrorQueueName)))
                {
                    throw new NiceException("The MSMQ queue '{0}' does not exist!", parameters.ErrorQueueName);
                }

                var msmqMessageQueue = new MsmqMessageQueue(parameters.ErrorQueueName, allowRemoteQueue: true);
                var allTheMessages   = GetAllTheMessages(msmqMessageQueue, transactionContext);

                foreach (var message in allTheMessages)
                {
                    var transportMessageToSend = message.ToForwardableMessage();

                    try
                    {
                        if (!transportMessageToSend.Headers.ContainsKey(Headers.SourceQueue))
                        {
                            throw new NiceException(
                                      "Message {0} does not have a source queue header - it will be moved back to the input queue",
                                      message.Id);
                        }

                        var sourceQueue = (string)transportMessageToSend.Headers[Headers.SourceQueue];

                        if (parameters.AutoMoveAllMessages.GetValueOrDefault())
                        {
                            msmqMessageQueue.Send(sourceQueue, transportMessageToSend, transactionContext);

                            Print("Moved {0} to {1}", message.Id, sourceQueue);
                        }
                        else
                        {
                            var answer = PromptChar(new[] { 'y', 'n' }, "Would you like to move {0} to {1}? (y/n)",
                                                    message.Id, sourceQueue);

                            if (answer == 'y')
                            {
                                msmqMessageQueue.Send(sourceQueue, transportMessageToSend, transactionContext);

                                Print("Moved {0} to {1}", message.Id, sourceQueue);
                            }
                            else
                            {
                                msmqMessageQueue.Send(msmqMessageQueue.InputQueueAddress,
                                                      transportMessageToSend,
                                                      transactionContext);

                                Print("Moved {0} to {1}", message.Id, msmqMessageQueue.InputQueueAddress);
                            }
                        }
                    }
                    catch (NiceException e)
                    {
                        Print(e.Message);

                        msmqMessageQueue.Send(msmqMessageQueue.InputQueueAddress,
                                              transportMessageToSend,
                                              transactionContext);
                    }
                }

                if (parameters.DryRun.GetValueOrDefault())
                {
                    Print("Aborting queue transaction");
                    return;
                }

                if (!parameters.Interactive)
                {
                    tx.Complete();
                    return;
                }

                var commitAnswer = PromptChar(new[] { 'y', 'n' }, "Would you like to commit the queue transaction?");

                if (commitAnswer == 'y')
                {
                    Print("Committing queue transaction");

                    tx.Complete();
                    return;
                }

                Print("Queue transaction aborted");
            }
        }