[prev in list] [next in list] [prev in thread] [next in thread] 

List:       activemq-dev
Subject:    [jira] [Commented] (AMQNET-323) NMS Client does not respect
From:       "Timothy Bish (JIRA)" <jira+amqnet () apache ! org>
Date:       2011-03-31 20:49:05
Message-ID: 1558578628.25639.1301604545695.JavaMail.tomcat () hel ! zones ! apache ! org
[Download RAW message or body]


    [ https://issues.apache.org/jira/browse/AMQNET-323?page=com.atlassian.jira.plugin. \
system.issuetabpanels:comment-tabpanel&focusedCommentId=13014194#comment-13014194 ] 

Timothy Bish commented on AMQNET-323:
-------------------------------------

We need to leave the NMSTimeToLive setter as its used by the Message transformation \
stuff to pass through the Message properties when converting one providers Message \
type to another's.  

I think the thing to do is just clearly define what the MessageProducer does in its \
various send methods.  Right now it seems there's at least three ways that a TTL \
value can get set or accidentally be set, maybe four.  I just find the current \
methodology kinda confusing and it just feels error prone to me.  I don't mind if we \
deviate from the JMS spec in some areas, but when we do we should really be careful \
to make it clear in the NMS API docs.

Having the producer actually compute the expiration time and set it seems best since \
a Message could also be created ahead of time and not sent right away, and since \
NMSTimeToLive takes a TimeSpan it could result in messages getting timed out our way \
to early.  

@Matthew, I'm looking into the test failure now, think I know where its going wrong, \
will report back when I have a fix.

> NMS Client does not respect TimeToLive with Listener callback
> -------------------------------------------------------------
> 
> Key: AMQNET-323
> URL: https://issues.apache.org/jira/browse/AMQNET-323
> Project: ActiveMQ .Net
> Issue Type: Bug
> Components: ActiveMQ, NMS
> Affects Versions: 1.5.0
> Environment: Windows 7
> Reporter: Matthew Good
> Assignee: Jim Gomes
> Attachments: TtlUnitTest.txt
> 
> 
> When TimeToLive expires while a listener is in a redeliver loop, the redelivery \
> never stops.  The following unit tests show this.  The first unit test uses Receive \
> and it works fine.  The second uses a listener and it fails. I added these tests to \
> AMQRedeliveryPolicyTests {code}
> [Test]
> public void TestNornalRedeliveryPolicyOnRollbackUntilTimeToLive()
> {
> using(Connection connection = (Connection) CreateConnection())
> {
> IRedeliveryPolicy policy = connection.RedeliveryPolicy;
> policy.MaximumRedeliveries = -1;
> policy.InitialRedeliveryDelay = 500;
> policy.UseExponentialBackOff = false;
> connection.Start();
> ISession session = connection.CreateSession(AcknowledgementMode.Transactional);
> IDestination destination = session.CreateTemporaryQueue();
> IMessageProducer producer = session.CreateProducer(destination);
> IMessageConsumer consumer = session.CreateConsumer(destination);
> // Send the messages
> ITextMessage textMessage = session.CreateTextMessage("1st");
> textMessage.NMSTimeToLive = TimeSpan.FromMilliseconds(800.0);
> producer.Send(textMessage);
> session.Commit();
> ITextMessage m;
> m = (ITextMessage)consumer.Receive(TimeSpan.FromMilliseconds(1000));
> Assert.IsNotNull(m);
> Assert.AreEqual("1st", m.Text);
> session.Rollback();
> // No delay on first Rollback..
> m = (ITextMessage)consumer.Receive(TimeSpan.FromMilliseconds(100));
> Assert.IsNotNull(m);
> session.Rollback();
> // Show subsequent re-delivery delay is incrementing.
> m = (ITextMessage)consumer.Receive(TimeSpan.FromMilliseconds(100));
> Assert.IsNull(m);
> m = (ITextMessage)consumer.Receive(TimeSpan.FromMilliseconds(700));
> Assert.IsNotNull(m);
> Assert.AreEqual("1st", m.Text);
> session.Rollback();
> // The message gets redelivered after 500 ms every time since
> // we are not using exponential backoff.
> m = (ITextMessage)consumer.Receive(TimeSpan.FromMilliseconds(700));
> Assert.IsNull(m);
> 
> }
> }
> [Test]
> public void TestNornalRedeliveryPolicyOnRollbackUntilTimeToLiveCallback()
> {
> using(Connection connection = (Connection) CreateConnection())
> {
> IRedeliveryPolicy policy = connection.RedeliveryPolicy;
> policy.MaximumRedeliveries = -1;
> policy.InitialRedeliveryDelay = 500;
> policy.UseExponentialBackOff = false;
> connection.Start();
> ISession session = connection.CreateSession(AcknowledgementMode.Transactional);
> IDestination destination = session.CreateTemporaryQueue();
> IMessageProducer producer = session.CreateProducer(destination);
> IMessageConsumer consumer = session.CreateConsumer(destination);
> CallbackClass cc = new CallbackClass(session);
> consumer.Listener += new MessageListener(cc.consumer_Listener);
> // Send the messages
> ITextMessage textMessage = session.CreateTextMessage("1st");
> textMessage.NMSTimeToLive = TimeSpan.FromMilliseconds(800.0);
> producer.Send(textMessage);
> session.Commit();
> // sends normal message, then immediate retry, then retry after 500 ms, then \
> expire. Thread.Sleep(2000);
> Assert.AreEqual(3, cc.numReceived);
> 
> }
> }
> class CallbackClass
> {
> private ISession session;
> public int numReceived = 0;
> public CallbackClass(ISession session)
> {
> this.session = session;
> }
> public void consumer_Listener(IMessage message)
> {
> numReceived++;
> ITextMessage m = message as ITextMessage;
> Assert.IsNotNull(m);
> Assert.AreEqual("1st", m.Text);
> session.Rollback();
> }
> }
> {code}

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic