[ 
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

Reply via email to