예제 #1
0
        public void DoTestSynchRecover()
        {
            session = connection.CreateSession(AcknowledgementMode.ClientAcknowledge);
            IMessageConsumer consumer = session.CreateConsumer(destination);

            connection.Start();

            IMessageProducer producer = session.CreateProducer(destination);

            producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
            producer.Send(session.CreateTextMessage("First"));
            producer.Send(session.CreateTextMessage("Second"));

            ITextMessage message = consumer.Receive(TimeSpan.FromMilliseconds(2000)) as ITextMessage;

            Assert.AreEqual("First", message.Text);
            Assert.IsFalse(message.NMSRedelivered);
            message.Acknowledge();

            message = (ITextMessage)consumer.Receive(TimeSpan.FromMilliseconds(2000));
            Assert.AreEqual("Second", message.Text);
            Assert.IsFalse(message.NMSRedelivered);

            session.Recover();

            message = (ITextMessage)consumer.Receive(TimeSpan.FromMilliseconds(3000));
            Assert.AreEqual("Second", message.Text);
            Assert.IsTrue(message.NMSRedelivered);

            message.Acknowledge();
        }
예제 #2
0
        protected void HandleMessage(IMessage receivedMsg)
        {
            ITextMessage message = receivedMsg as ITextMessage;

            if (message == null)
            {
                Logger.Warning(string.Format("received JMS message with id {0} which is not a text message", receivedMsg.NMSMessageId));
                receivedMsg.Acknowledge();
                return;
            }

            Logger.Debug(string.Format("received text message with id {0} and text {1}", message.NMSMessageId, message.Text));

            try
            {
                ICacheEvent cacheEvent = CacheEventSerializer.Deserialize(message.Text);
                foreach (IObserver <ICacheEvent> observer in observers)
                {
                    observer.OnNext(cacheEvent);
                }
            }
            catch (Exception e)
            {
                Logger.Error("error in invalidation transaction: {0}", e.ToString());
                foreach (IObserver <ICacheEvent> observer in observers)
                {
                    observer.OnError(e);
                }
            }
            finally
            {
                message.Acknowledge();
                Logger.Debug(string.Format("acknowledged received message with id {0}", message.NMSMessageId));
            }
        }
예제 #3
0
        public T ReceiveMessage <T>(string queueName, out string originMessage) where T : class
        {
            originMessage = null;

            using (ISession session = CreateSession(AcknowledgementMode.ClientAcknowledge))
            {
                var queue    = session.GetQueue(queueName);
                var comsumer = session.CreateConsumer(queue);

                ITextMessage message = comsumer.Receive(timeOut) as ITextMessage;
                if (message == null || string.IsNullOrWhiteSpace(message.Text))
                {
                    return(default(T));
                }

                originMessage = message.Text;
                try
                {
                    T t = Newtonsoft.Json.JsonConvert.DeserializeObject <T>(message.Text);
                    message.Acknowledge();
                    return(t);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    connection.Stop();
                }
            }
        }
예제 #4
0
 /// <summary>
 /// 提交
 /// </summary>
 public void Commit()
 {
     if (!isCommitted)
     {
         isCommitted = true;
         message.Acknowledge();
     }
 }
예제 #5
0
        private void OnTestAsynchRecoverMessage(IMessage msg)
        {
            counter++;
            try
            {
                ITextMessage message = msg as ITextMessage;
                switch (counter)
                {
                case 1:
                    Tracer.Debug("Got first Message: " + message.Text);
                    Assert.AreEqual("First", message.Text);
                    Assert.IsFalse(message.NMSRedelivered);
                    message.Acknowledge();
                    break;

                case 2:
                    Tracer.Debug("Got Second Message: " + message.Text);
                    Assert.AreEqual("Second", message.Text);
                    Assert.IsFalse(message.NMSRedelivered);
                    session.Recover();
                    break;

                case 3:
                    Tracer.Debug("Got Third Message: " + message.Text);
                    Assert.AreEqual("Second", message.Text);
                    Assert.IsTrue(message.NMSRedelivered);
                    message.Acknowledge();
                    doneCountDownLatch.countDown();
                    break;

                default:
                    errorMessage = "Got too many messages: " + counter;
                    Tracer.Debug(errorMessage);
                    doneCountDownLatch.countDown();
                    break;
                }
            }
            catch (Exception e)
            {
                errorMessage = "Got exception: " + e.Message;
                Tracer.Warn("Exception on Message Receive: " + e.Message);
                doneCountDownLatch.countDown();
            }
        }
예제 #6
0
        public void TestSendWhileClosed(AcknowledgementMode ackMode)
        {
            try
            {
                using (IConnection connection = CreateConnection(TEST_CLIENT_ID))
                {
                    connection.Start();

                    using (ISession session = connection.CreateSession(ackMode))
                    {
                        ITopic           topic    = session.GetTopic(DURABLE_TOPIC);
                        IMessageProducer producer = session.CreateProducer(topic);

                        producer.DeliveryMode = MsgDeliveryMode.Persistent;

                        ISession         consumeSession = connection.CreateSession(ackMode);
                        IMessageConsumer consumer       = consumeSession.CreateDurableConsumer(topic, CONSUMER_ID, null, false);
                        Thread.Sleep(1000);
                        consumer.Dispose();
                        consumer = null;

                        ITextMessage message = session.CreateTextMessage("DurableTest-TestSendWhileClosed");
                        message.Properties.SetString("test", "test");
                        message.NMSType = "test";
                        producer.Send(message);
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            session.Commit();
                        }

                        consumer = consumeSession.CreateDurableConsumer(topic, CONSUMER_ID, null, false);
                        ITextMessage msg = consumer.Receive(TimeSpan.FromMilliseconds(1000)) as ITextMessage;
                        msg.Acknowledge();
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            consumeSession.Commit();
                        }

                        Assert.IsNotNull(msg);
                        Assert.AreEqual(msg.Text, "DurableTest-TestSendWhileClosed");
                        Assert.AreEqual(msg.NMSType, "test");
                        Assert.AreEqual(msg.Properties.GetString("test"), "test");
                    }
                }
            }
            catch (Exception ex)
            {
                Assert.Fail(ex.Message);
            }
            finally
            {
                UnregisterDurableConsumer(TEST_CLIENT_ID, CONSUMER_ID);
            }
        }
예제 #7
0
        public void ShouldAcknowledgeMessagesIfValid()
        {
            _source = new MessageSource <ITestMessage>(_lazyConnection, new[] { _deserializer }, _destination,
                                                       AcknowledgementMode.ClientAcknowledge);

            Mock <IMessageConsumer> mockConsumer = MockConsumerExtensions.Create(_session, _destination);
            ITextMessage            textMessage  = A.Fake <ITextMessage>();

            _source.Messages.Subscribe(_observer);
            mockConsumer.RaiseFakeMessage(textMessage);

            A.CallTo(() => textMessage.Acknowledge()).MustHaveHappened(Repeated.Exactly.Once);
        }
        public void SendReceiveVirtualTopicMessage(AcknowledgementMode ackMode, MsgDeliveryMode deliveryMode)
        {
            using (IConnection connection = CreateConnection(TEST_CLIENT_ID))
            {
                connection.Start();
                using (ISession session = connection.CreateSession(ackMode))
                {
                    using (IMessageConsumer consumerA = session.CreateConsumer(session.GetQueue(CONSUMER_A_DESTINATION_NAME)))
                        using (IMessageConsumer consumerB = session.CreateConsumer(session.GetQueue(CONSUMER_B_DESTINATION_NAME)))
                            using (IMessageProducer producer = session.CreateProducer(session.GetTopic(PRODUCER_DESTINATION_NAME)))
                            {
                                producer.RequestTimeout = receiveTimeout;
                                producer.DeliveryMode   = deliveryMode;

                                for (int index = 0; index < totalMsgs; index++)
                                {
                                    string msgText = "Message #" + index;
                                    Tracer.Info("Sending: " + msgText);
                                    producer.Send(session.CreateTextMessage(msgText));
                                }

                                if (AcknowledgementMode.Transactional == ackMode)
                                {
                                    session.Commit();
                                }

                                for (int index = 0; index < totalMsgs; index++)
                                {
                                    string       msgText  = "Message #" + index;
                                    ITextMessage messageA = consumerA.Receive(receiveTimeout) as ITextMessage;
                                    Assert.IsNotNull(messageA, "Did not receive message for consumer A.");
                                    messageA.Acknowledge();
                                    Tracer.Info("Received A: " + msgText);

                                    ITextMessage messageB = consumerB.Receive(receiveTimeout) as ITextMessage;
                                    Assert.IsNotNull(messageB, "Did not receive message for consumer B.");
                                    messageB.Acknowledge();
                                    Tracer.Info("Received B: " + msgText);

                                    Assert.AreEqual(msgText, messageA.Text, "Message text A does not match.");
                                    Assert.AreEqual(msgText, messageB.Text, "Message text B does not match.");
                                }

                                if (AcknowledgementMode.Transactional == ackMode)
                                {
                                    session.Commit();
                                }
                            }
                }
            }
        }
예제 #9
0
        public void ShouldNotAcknowledgeMessagesIfInvalid()
        {
            _source = new MessageSource <ITestMessage>(_lazyConnection, new[] { _deserializer }, _destination,
                                                       AcknowledgementMode.ClientAcknowledge);

            Mock <IMessageConsumer> mockConsumer = MockConsumerExtensions.Create(_session, _destination);
            ITextMessage            textMessage  = A.Fake <ITextMessage>();

            A.CallTo(() => _deserializer.Deserialize(A <string> .Ignored)).Throws <Exception>();

            _source.Messages.Subscribe(_observer);
            mockConsumer.RaiseFakeMessage(textMessage);

            A.CallTo(() => textMessage.Acknowledge()).MustNotHaveHappened();
        }
예제 #10
0
        public void ShouldAcknowledgeMessagesIfValid()
        {
            _source = new MessageSource <ITestMessage>(_lazyConnection, new[] { _deserializer }, _destination,
                                                       AcknowledgementMode.ClientAcknowledge);

            var consumer = A.Fake <IMessageConsumer>();

            A.CallTo(() => _session.CreateConsumer(_destination, null, false)).Returns(consumer);

            ITextMessage textMessage = A.Fake <ITextMessage>();

            _source.Messages.Subscribe(_observer);
            consumer.Listener += Raise.FreeForm.With((Apache.NMS.IMessage)textMessage);

            A.CallTo(() => textMessage.Acknowledge()).MustHaveHappened(Repeated.Exactly.Once);
        }
예제 #11
0
        public void TestIndividualAcknowledgeMultiMessages_AcknowledgeFirstTest()
        {
            ISession session = connection.CreateSession(AcknowledgementMode.IndividualAcknowledge);

            // Push 2 messages to queue
            ITemporaryQueue  queue    = session.CreateTemporaryQueue();
            IMessageProducer producer = session.CreateProducer(queue);

            ITextMessage msg = session.CreateTextMessage("test 1");

            producer.Send(msg, MsgDeliveryMode.Persistent, MsgPriority.Normal, TimeSpan.MinValue);
            msg = session.CreateTextMessage("test 2");
            producer.Send(msg, MsgDeliveryMode.Persistent, MsgPriority.Normal, TimeSpan.MinValue);
            producer.Close();

            IMessageConsumer consumer = session.CreateConsumer(queue);

            // Read the first message
            ITextMessage fetchedMessage1 = (ITextMessage)consumer.Receive(TimeSpan.FromMilliseconds(2000));

            Assert.IsNotNull(fetchedMessage1);
            Assert.AreEqual("test 1", fetchedMessage1.Text);

            // Read the second message
            ITextMessage fetchedMessage2 = (ITextMessage)consumer.Receive(TimeSpan.FromMilliseconds(2000));

            Assert.IsNotNull(fetchedMessage2);
            Assert.AreEqual("test 2", fetchedMessage2.Text);

            // Acknowledge first message
            fetchedMessage1.Acknowledge();

            consumer.Close();

            // Read first message a second time
            consumer        = session.CreateConsumer(queue);
            fetchedMessage1 = (ITextMessage)consumer.Receive(TimeSpan.FromMilliseconds(2000));
            Assert.IsNotNull(fetchedMessage1);
            Assert.AreEqual("test 2", fetchedMessage1.Text);

            // Try to read second message a second time
            fetchedMessage2 = (ITextMessage)consumer.Receive(TimeSpan.FromMilliseconds(2000));
            Assert.IsNull(fetchedMessage2);
            consumer.Close();
        }
예제 #12
0
        public void TestLastMessageAcked()
        {
            ISession         session  = connection.CreateSession(AcknowledgementMode.IndividualAcknowledge);
            ITemporaryQueue  queue    = session.CreateTemporaryQueue();
            IMessageProducer producer = session.CreateProducer(queue);
            ITextMessage     msg1     = session.CreateTextMessage("msg1" + Guid.NewGuid().ToString());
            ITextMessage     msg2     = session.CreateTextMessage("msg2" + Guid.NewGuid().ToString());
            ITextMessage     msg3     = session.CreateTextMessage("msg3" + Guid.NewGuid().ToString());

            producer.Send(msg1);
            producer.Send(msg2);
            producer.Send(msg3);

            // Consume the message...
            IMessageConsumer consumer = session.CreateConsumer(queue);
            ITextMessage     ackmsg   = consumer.Receive(TimeSpan.FromMilliseconds(1000)) as ITextMessage;

            Assert.IsNotNull(ackmsg);
            Assert.AreEqual(msg1.Text, ackmsg.Text);
            ackmsg = consumer.Receive(TimeSpan.FromMilliseconds(1000)) as ITextMessage;
            Assert.IsNotNull(ackmsg);
            Assert.AreEqual(msg2.Text, ackmsg.Text);
            ackmsg = consumer.Receive(TimeSpan.FromMilliseconds(1000)) as ITextMessage;
            Assert.IsNotNull(ackmsg);
            Assert.AreEqual(msg3.Text, ackmsg.Text);
            ackmsg.Acknowledge();

            // Reset the session.
            session.Close();
            session = connection.CreateSession(AcknowledgementMode.IndividualAcknowledge);

            // Attempt to Consume the message...
            consumer = session.CreateConsumer(queue);
            ackmsg   = consumer.Receive(TimeSpan.FromMilliseconds(1000)) as ITextMessage;
            Assert.IsNotNull(ackmsg);
            Assert.AreEqual(msg1.Text, ackmsg.Text);
            ackmsg = consumer.Receive(TimeSpan.FromMilliseconds(1000)) as ITextMessage;
            Assert.IsNotNull(ackmsg);
            Assert.AreEqual(msg2.Text, ackmsg.Text);
            IMessage msg = consumer.Receive(TimeSpan.FromMilliseconds(1000));

            Assert.IsNull(msg);
            session.Close();
        }
        private void OnMessage(IMessageConsumer sender, MessageEventArgs args)
        {
            ITextMessage msg = (ITextMessage)args.Message;

            dynamic  rawMetricObject = JsonConvert.DeserializeObject(msg.Text);
            DateTime epoch           = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

            long dateLong = Convert.ToInt64((rawMetricObject.date.Value - epoch).Millisecond);

            Atlantis.RawMetrics.DAL.Models.RawMetric modelMetric = new Atlantis.RawMetrics.DAL.Models.RawMetric()
            {
                Date     = dateLong,
                DeviceId = (int)rawMetricObject.deviceId.Value,
                Value    = rawMetricObject.value.Value
            };
            RawMetric returnValue;

            returnValue = dao.Create(modelMetric);
            msg.Acknowledge();
        }
예제 #14
0
        static void Main(string[] args)
        {
            Uri connecturi = new Uri("activemq:tcp://activemq:61616");

            // NOTE: ensure the nmsprovider-activemq.config file exists in the executable folder.
            IConnectionFactory factory = new NMSConnectionFactory(connecturi);

            using (IConnection connection = factory.CreateConnection())
                using (ISession session = connection.CreateSession())
                {
                    IDestination destination = SessionUtil.GetDestination(session, "queue://FOO.BAR");

                    // Create a consumer and producer
                    using (IMessageConsumer consumer = session.CreateConsumer(destination))
                    {
                        // Start the connection so that messages will be processed.
                        connection.Start();

                        // Consume a message
                        while (true)
                        {
                            ITextMessage message = consumer.Receive() as ITextMessage;
                            if (message == null)
                            {
                                Console.WriteLine("No message received!");
                            }
                            else
                            {
                                message.Acknowledge();

                                Console.WriteLine("Received message with ID:   " + message.NMSMessageId);
                                Console.WriteLine("Received message with text: " + message.Text);
                            }
                        }
                    }
                }
        }
예제 #15
0
        protected void OnInvalidate(IMessage receivedMsg)
        {
            IObjectMessage m2 = receivedMsg as IObjectMessage;

            Debug.WriteLine("message has the following raw content:");
            // Debug.WriteLine(m2.)
            try
            {
                object obj = m2.Body;
            }
            catch (Exception e)
            {
                Debug.WriteLine("caught exception while accessing message body: " + e.Message);
            }
            object obj2 = m2.ToObject();

            var msg    = receivedMsg as IBytesMessage;
            var result = msg != null ? new UTF8Encoding().GetString(msg.Content) : "bytes message is null";

            ITextMessage message = receivedMsg as ITextMessage;

            if (message == null)
            {
                Logger.Debug(string.Format("message with id {0} is not a text message", receivedMsg.NMSMessageId));
                Debug.WriteLine(string.Format("message with id {0} is not a text message", receivedMsg.NMSMessageId));
                receivedMsg.Acknowledge();
                return;
            }

            Logger.Debug(string.Format("received text message with id {0} and text {1}", message.NMSMessageId, message.Text));
            Debug.WriteLine(string.Format("received text message with id {0} and text {1}", message.NMSMessageId, message.Text));

            try
            {
                var invalidationInformation = GetInvalidationInformation(message);
                foreach (string dcpUri in invalidationInformation.InvalidationDcps)
                {
                    foreach (ICacheAgent cacheAgent in CacheAgents)
                    {
                        Logger.Debug(string.Format("telling cache agent {0} to remove DCP with uri {1}", cacheAgent.GetType().Name, dcpUri));
                        //cacheAgent.Remove(dcpUri)
                    }
                }
                foreach (InvalidationUrl url in invalidationInformation.InvalidationUrls)
                {
                    foreach (ICacheAgent cacheAgent in CacheAgents)
                    {
                        Logger.Debug(string.Format("telling cache agent {0} to remove page with url {1}", cacheAgent.GetType().Name, url.TcmUri));
                        //cacheAgent.Remove(url.TcmUri)
                    }
                }

                //LoggerService.Debug("<<Received message: finished processing");
            }
            catch (Exception e)
            {
                Logger.Error("error in invalidation transaction: {0}", e.ToString());
            }
            finally
            {
                message.Acknowledge();
                Logger.Debug(string.Format("acknowledged received message with id {0}", message.NMSMessageId));
            }
        }
예제 #16
0
        public void SendReceiveVirtualTopicMessage(
            [Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
                    AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
            AcknowledgementMode ackMode,
            [Values(MsgDeliveryMode.NonPersistent, MsgDeliveryMode.Persistent)]
            MsgDeliveryMode deliveryMode)
        {
            using (IConnection connection = CreateConnection(TEST_CLIENT_ID))
            {
                connection.Start();
                using (ISession session = connection.CreateSession(ackMode))
                {
                    using (IMessageConsumer consumerA = session.CreateConsumer(session.GetQueue(CONSUMER_A_DESTINATION_NAME)))
                        using (IMessageConsumer consumerB = session.CreateConsumer(session.GetQueue(CONSUMER_B_DESTINATION_NAME)))
                            using (IMessageProducer producer = session.CreateProducer(session.GetTopic(PRODUCER_DESTINATION_NAME)))
                            {
                                producer.DeliveryMode = deliveryMode;

                                for (int index = 0; index < totalMsgs; index++)
                                {
                                    string msgText = "Message #" + index;
                                    Tracer.Info("Sending: " + msgText);
                                    producer.Send(session.CreateTextMessage(msgText));
                                }

                                if (AcknowledgementMode.Transactional == ackMode)
                                {
                                    session.Commit();
                                }

                                for (int index = 0; index < totalMsgs; index++)
                                {
                                    string       msgText  = "Message #" + index;
                                    ITextMessage messageA = consumerA.Receive(receiveTimeout) as ITextMessage;
                                    Assert.IsNotNull(messageA, "Did not receive message for consumer A.");
                                    messageA.Acknowledge();
                                    Tracer.Info("Received A: " + msgText);

                                    ITextMessage messageB = consumerB.Receive(receiveTimeout) as ITextMessage;
                                    Assert.IsNotNull(messageB, "Did not receive message for consumer B.");
                                    messageB.Acknowledge();
                                    Tracer.Info("Received B: " + msgText);

                                    Assert.AreEqual(msgText, messageA.Text, "Message text A does not match.");
                                    Assert.AreEqual(msgText, messageB.Text, "Message text B does not match.");
                                }

                                if (AcknowledgementMode.Transactional == ackMode)
                                {
                                    session.Commit();
                                }
                            }

                    // Give the Broker some time to remove the subscriptions.
                    Thread.Sleep(2000);

                    try
                    {
                        ((Session)session).DeleteDestination(session.GetQueue(CONSUMER_A_DESTINATION_NAME));
                        ((Session)session).DeleteDestination(session.GetQueue(CONSUMER_B_DESTINATION_NAME));
                    }
                    catch
                    {
                    }
                }
            }
        }
예제 #17
0
        public void TestDurableConsumerSelectorChange(
            [Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
                    AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
            AcknowledgementMode ackMode)
        {
            try
            {
                using (IConnection connection = CreateConnection(TEST_CLIENT_AND_CONSUMER_ID))
                {
                    connection.Start();
                    using (ISession session = connection.CreateSession(ackMode))
                    {
                        ITopic           topic    = (ITopic)CreateDestination(session, DestinationType.Topic);
                        IMessageProducer producer = session.CreateProducer(topic);
                        IMessageConsumer consumer = session.CreateDurableConsumer(topic, TEST_CLIENT_AND_CONSUMER_ID,
                                                                                  "color='red'", false);

                        producer.DeliveryMode = MsgDeliveryMode.Persistent;

                        // Send the messages
                        ITextMessage sendMessage = session.CreateTextMessage("1st");
                        sendMessage.Properties["color"] = "red";
                        producer.Send(sendMessage);
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            session.Commit();
                        }

                        ITextMessage receiveMsg = consumer.Receive(receiveTimeout) as ITextMessage;
                        Assert.IsNotNull(receiveMsg, "Failed to retrieve 1st durable message.");
                        Assert.AreEqual("1st", receiveMsg.Text);
                        Assert.AreEqual(MsgDeliveryMode.Persistent, receiveMsg.NMSDeliveryMode,
                                        "NMSDeliveryMode does not match");
                        receiveMsg.Acknowledge();
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            session.Commit();
                        }

                        // Change the subscription, allowing some time for the Broker to purge the
                        // consumers resources.
                        consumer.Dispose();
                        Thread.Sleep(1000);

                        consumer = session.CreateDurableConsumer(topic, TEST_CLIENT_AND_CONSUMER_ID, "color='blue'",
                                                                 false);

                        sendMessage = session.CreateTextMessage("2nd");
                        sendMessage.Properties["color"] = "red";
                        producer.Send(sendMessage);
                        sendMessage = session.CreateTextMessage("3rd");
                        sendMessage.Properties["color"] = "blue";
                        producer.Send(sendMessage);
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            session.Commit();
                        }

                        // Selector should skip the 2nd message.
                        receiveMsg = consumer.Receive(receiveTimeout) as ITextMessage;
                        Assert.IsNotNull(receiveMsg, "Failed to retrieve durable message.");
                        Assert.AreEqual("3rd", receiveMsg.Text, "Retrieved the wrong durable message.");
                        Assert.AreEqual(MsgDeliveryMode.Persistent, receiveMsg.NMSDeliveryMode,
                                        "NMSDeliveryMode does not match");
                        receiveMsg.Acknowledge();
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            session.Commit();
                        }

                        // Make sure there are no pending messages.
                        Assert.IsNull(consumer.ReceiveNoWait(), "Wrong number of messages in durable subscription.");
                    }
                }
            }
            catch (Exception ex)
            {
                Assert.Fail(ex.Message);
            }
            finally
            {
                // Pause to allow Stomp to unregister at the broker.
                Thread.Sleep(500);

                UnregisterDurableConsumer(TEST_CLIENT_AND_CONSUMER_ID, TEST_CLIENT_AND_CONSUMER_ID);
            }
        }
예제 #18
0
        public void TestSendWhileClosed(
            [Values(AcknowledgementMode.AutoAcknowledge, AcknowledgementMode.ClientAcknowledge,
                    AcknowledgementMode.DupsOkAcknowledge, AcknowledgementMode.Transactional)]
            AcknowledgementMode ackMode)
        {
            try
            {
                using (IConnection connection = CreateConnection(TEST_CLIENT_AND_CONSUMER_ID))
                {
                    connection.Start();

                    using (ISession session = connection.CreateSession(ackMode))
                    {
                        ITopic           topic    = (ITopic)CreateDestination(session, DestinationType.Topic);
                        IMessageProducer producer = session.CreateProducer(topic);

                        producer.DeliveryMode = MsgDeliveryMode.Persistent;

                        ISession         consumeSession = connection.CreateSession(ackMode);
                        IMessageConsumer consumer       =
                            consumeSession.CreateDurableConsumer(topic, TEST_CLIENT_AND_CONSUMER_ID, null, false);
                        Thread.Sleep(1000);
                        consumer.Dispose();
                        consumer = null;

                        ITextMessage message = session.CreateTextMessage("DurableTest-TestSendWhileClosed");
                        message.Properties.SetString("test", "test");
                        message.NMSType = "test";
                        producer.Send(message);
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            session.Commit();
                        }

                        Thread.Sleep(1000);
                        consumer = consumeSession.CreateDurableConsumer(topic, TEST_CLIENT_AND_CONSUMER_ID, null,
                                                                        false);
                        ITextMessage msg = consumer.Receive(TimeSpan.FromMilliseconds(1000)) as ITextMessage;
                        msg.Acknowledge();
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            consumeSession.Commit();
                        }

                        Assert.IsNotNull(msg);
                        Assert.AreEqual(msg.Text, "DurableTest-TestSendWhileClosed");
                        Assert.AreEqual(msg.NMSType, "test");
                        Assert.AreEqual(msg.Properties.GetString("test"), "test");
                    }
                }
            }
            catch (Exception ex)
            {
                Assert.Fail(ex.Message);
            }
            finally
            {
                // Pause to allow Stomp to unregister at the broker.
                Thread.Sleep(500);

                UnregisterDurableConsumer(TEST_CLIENT_AND_CONSUMER_ID, TEST_CLIENT_AND_CONSUMER_ID);
            }
        }
예제 #19
0
    public void ReloadData()
    {
        if (_AsyncReadThread != null)
        {
            if (_AsyncReadThread.IsAlive)
            {
                return; // Already fetching data
            }
        }
        _AsyncReadThread = new Thread(() =>
        {
            if (isStopping)
            {
                return;
            }

            try
            {
                // Consume a message
                semaphore.WaitOne((int)receiveTimeout.TotalMilliseconds, true);
                if (message == null)
                {
                    //selfReference.UpdateText("No message received!" + "\n");
                }
                else
                {
                    if (lastMessage != null)
                    {
                        if (lastMessage.NMSMessageId == message.NMSMessageId)
                        {
                            return; //sameMessage
                        }
                        else
                        {
                            this.lastMessage = message;
                        }
                    }
                    else
                    {
                        this.lastMessage = message;
                    }
                    message.Acknowledge();

                    if (debug)
                    {
                        selfReference.UpdateText("Received message with text: " + message.Text);
                    }

                    GameplayTypes gameTypes = GameplayTypes.NONE;

                    if (message.Properties.Contains("GameType"))
                    {
                        gameTypes = (GameplayTypes)Enum.Parse(typeof(GameplayTypes), message.Properties.GetString("GameType"));
                    }
                    switch (gameTypes)
                    {
                    case GameplayTypes.Connect:
                        HandleConnectionMessage();
                        break;

                    case GameplayTypes.Disconnect:
                        HandleDisconnectMessage();
                        break;

                    case GameplayTypes.Initialised:
                        HandleInitialisedMessage();
                        break;

                    case GameplayTypes.Movement:
                        break;

                    case GameplayTypes.Turn:
                        break;

                    case GameplayTypes.Surrender:
                        break;

                    default:
                        //No Default Handler
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                //selfReference.UpdateText(e.Message + " -" + e.GetBaseException().ToString() + "\n");
            }
        });

        _AsyncReadThread.Start();
    }
예제 #20
0
        public void TestDurableConsumerSelectorChange(AcknowledgementMode ackMode)
        {
            try
            {
                using (IConnection connection = CreateConnection(TEST_CLIENT_ID))
                {
                    connection.Start();
                    using (ISession session = connection.CreateSession(ackMode))
                    {
                        ITopic           topic    = session.GetTopic(DURABLE_TOPIC);
                        IMessageProducer producer = session.CreateProducer(topic);
                        IMessageConsumer consumer = session.CreateDurableConsumer(topic, CONSUMER_ID, "color='red'", false);

                        producer.DeliveryMode = MsgDeliveryMode.Persistent;

                        // Send the messages
                        ITextMessage sendMessage = session.CreateTextMessage("1st");
                        sendMessage.Properties["color"] = "red";
                        producer.Send(sendMessage);
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            session.Commit();
                        }

                        ITextMessage receiveMsg = consumer.Receive(receiveTimeout) as ITextMessage;
                        Assert.IsNotNull(receiveMsg, "Failed to retrieve 1st durable message.");
                        Assert.AreEqual("1st", receiveMsg.Text);
                        Assert.AreEqual(MsgDeliveryMode.Persistent, receiveMsg.NMSDeliveryMode, "NMSDeliveryMode does not match");
                        receiveMsg.Acknowledge();
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            session.Commit();
                        }

                        // Change the subscription.
                        consumer.Dispose();
                        consumer = session.CreateDurableConsumer(topic, CONSUMER_ID, "color='blue'", false);

                        sendMessage = session.CreateTextMessage("2nd");
                        sendMessage.Properties["color"] = "red";
                        producer.Send(sendMessage);
                        sendMessage = session.CreateTextMessage("3rd");
                        sendMessage.Properties["color"] = "blue";
                        producer.Send(sendMessage);
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            session.Commit();
                        }

                        // Selector should skip the 2nd message.
                        receiveMsg = consumer.Receive(receiveTimeout) as ITextMessage;
                        Assert.IsNotNull(receiveMsg, "Failed to retrieve durable message.");
                        Assert.AreEqual("3rd", receiveMsg.Text, "Retrieved the wrong durable message.");
                        Assert.AreEqual(MsgDeliveryMode.Persistent, receiveMsg.NMSDeliveryMode, "NMSDeliveryMode does not match");
                        receiveMsg.Acknowledge();
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            session.Commit();
                        }

                        // Make sure there are no pending messages.
                        Assert.IsNull(consumer.ReceiveNoWait(), "Wrong number of messages in durable subscription.");
                    }
                }
            }
            catch (Exception ex)
            {
                Assert.Fail(ex.Message);
            }
            finally
            {
                UnregisterDurableConsumer(TEST_CLIENT_ID, CONSUMER_ID);
            }
        }
예제 #21
0
        public void TestDurableConsumerSelectorChange(AcknowledgementMode ackMode)
        {
            string CLIENT_ID_AND_SUBSCIPTION = TEST_CLIENT_ID + ":" + new Random().Next();

            try
            {
                using (IConnection connection = CreateConnection(CLIENT_ID_AND_SUBSCIPTION))
                {
                    connection.Start();
                    using (ISession session = connection.CreateSession(ackMode))
                    {
                        ITopic           topic    = session.GetTopic(DURABLE_TOPIC);
                        IMessageProducer producer = session.CreateProducer(topic);
                        IMessageConsumer consumer = session.CreateDurableConsumer(topic, CLIENT_ID_AND_SUBSCIPTION, "color='red'", false);

                        producer.DeliveryMode = MsgDeliveryMode.Persistent;

                        // Send the messages
                        ITextMessage sendMessage = session.CreateTextMessage("1st");
                        sendMessage.Properties["color"] = "red";
                        producer.Send(sendMessage);
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            session.Commit();
                        }

                        ITextMessage receiveMsg = consumer.Receive(receiveTimeout) as ITextMessage;
                        Assert.IsNotNull(receiveMsg, "Failed to retrieve 1st durable message.");
                        Assert.AreEqual("1st", receiveMsg.Text);
                        Assert.AreEqual(MsgDeliveryMode.Persistent, receiveMsg.NMSDeliveryMode, "NMSDeliveryMode does not match");
                        receiveMsg.Acknowledge();
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            session.Commit();
                        }

                        // Change the subscription.
                        consumer.Dispose();

                        // Stomp connection at broker needs some time to cleanup.
                        Thread.Sleep(1000);

                        consumer = session.CreateDurableConsumer(topic, CLIENT_ID_AND_SUBSCIPTION, "color='blue'", false);

                        sendMessage = session.CreateTextMessage("2nd");
                        sendMessage.Properties["color"] = "red";
                        producer.Send(sendMessage);
                        sendMessage = session.CreateTextMessage("3rd");
                        sendMessage.Properties["color"] = "blue";
                        producer.Send(sendMessage);
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            session.Commit();
                        }

                        // Selector should skip the 2nd message.
                        receiveMsg = consumer.Receive(receiveTimeout) as ITextMessage;
                        Assert.IsNotNull(receiveMsg, "Failed to retrieve durable message.");
                        Assert.AreEqual("3rd", receiveMsg.Text, "Retrieved the wrong durable message.");
                        Assert.AreEqual(MsgDeliveryMode.Persistent, receiveMsg.NMSDeliveryMode, "NMSDeliveryMode does not match");
                        receiveMsg.Acknowledge();
                        if (AcknowledgementMode.Transactional == ackMode)
                        {
                            session.Commit();
                        }

                        // Make sure there are no pending messages.
                        Assert.IsNull(consumer.ReceiveNoWait(), "Wrong number of messages in durable subscription.");
                    }
                }
            }
            catch (Exception ex)
            {
                Assert.Fail(ex.Message);
            }
            finally
            {
                // Pause to allow Stomp to unregister at the broker.
                Thread.Sleep(250);

                UnregisterDurableConsumer(CLIENT_ID_AND_SUBSCIPTION, CLIENT_ID_AND_SUBSCIPTION);
            }
        }