You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ro...@apache.org on 2013/12/11 19:23:30 UTC

svn commit: r1550214 - in /qpid/jms/trunk/src: main/java/org/apache/qpid/jms/impl/MessageImpl.java test/java/org/apache/qpid/jms/impl/MessageImplTest.java

Author: robbie
Date: Wed Dec 11 18:23:30 2013
New Revision: 1550214

URL: http://svn.apache.org/r1550214
Log:
QPIDJMS-9: simplify handling of header.ttl-derived JMSDestination, also allowing the header.ttl field to be manipulated independently of the JMSDestination value

Modified:
    qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/MessageImpl.java
    qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/MessageImplTest.java

Modified: qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/MessageImpl.java
URL: http://svn.apache.org/viewvc/qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/MessageImpl.java?rev=1550214&r1=1550213&r2=1550214&view=diff
==============================================================================
--- qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/MessageImpl.java (original)
+++ qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/MessageImpl.java Wed Dec 11 18:23:30 2013
@@ -33,7 +33,7 @@ public abstract class MessageImpl<T exte
 {
     private final T _amqpMessage;
     private final SessionImpl _sessionImpl;
-    private final long _rcvTime;
+    private Long _jmsExpirationFromTTL = null;
     private Destination _destination;
     private Destination _replyTo;
 
@@ -42,7 +42,6 @@ public abstract class MessageImpl<T exte
     {
         _amqpMessage = amqpMessage;
         _sessionImpl = sessionImpl;
-        _rcvTime = 0;
     }
 
     //message just received
@@ -59,14 +58,12 @@ public abstract class MessageImpl<T exte
         String replyToTypeString = (String) _amqpMessage.getMessageAnnotation(DestinationHelper.REPLY_TO_TYPE_MSG_ANNOTATION_SYMBOL_NAME);
         _replyTo = sessionImpl.getDestinationHelper().decodeDestination(replyTo, replyToTypeString, consumerDestination, true);
 
-        //If we have to synthesize JMSExpiration from TTL, we will need a receipt time
-        if(_amqpMessage.getAbsoluteExpiryTime() == null && _amqpMessage.getTtl() != null)
-        {
-            _rcvTime = System.currentTimeMillis();
-        }
-        else
+        //If we have to synthesize JMSExpiration from only the AMQP TTL header, calculate it now
+        Long ttl = _amqpMessage.getTtl();
+        Long absoluteExpiryTime = _amqpMessage.getAbsoluteExpiryTime();
+        if(absoluteExpiryTime == null && ttl != null)
         {
-            _rcvTime = 0;
+            _jmsExpirationFromTTL = System.currentTimeMillis() + ttl;
         }
     }
 
@@ -317,11 +314,9 @@ public abstract class MessageImpl<T exte
             return absoluteExpiry;
         }
 
-        //derive from the ttl field if present
-        Long ttl = _amqpMessage.getTtl();
-        if(ttl != null)
+        if(_jmsExpirationFromTTL != null)
         {
-            return _rcvTime + ttl;
+            return _jmsExpirationFromTTL;
         }
 
         //failing the above, there is no expiration
@@ -331,6 +326,9 @@ public abstract class MessageImpl<T exte
     @Override
     public void setJMSExpiration(long expiration) throws JMSException
     {
+        //clear the ttl-derived value in case it was set, we are changing to an explicit value
+        _jmsExpirationFromTTL = null;
+
         if(expiration != 0)
         {
             _amqpMessage.setAbsoluteExpiryTime(expiration);
@@ -338,13 +336,6 @@ public abstract class MessageImpl<T exte
         else
         {
             _amqpMessage.setAbsoluteExpiryTime(null);
-
-            //As we are clearing JMSExpiration we must also clear the TTL field if it is
-            //set, or else it will lead to getJMSExpiration continuing to return a value
-            if(_amqpMessage.getTtl() != null)
-            {
-                _amqpMessage.setTtl(null);
-            }
         }
     }
 

Modified: qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/MessageImplTest.java
URL: http://svn.apache.org/viewvc/qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/MessageImplTest.java?rev=1550214&r1=1550213&r2=1550214&view=diff
==============================================================================
--- qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/MessageImplTest.java (original)
+++ qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/MessageImplTest.java Wed Dec 11 18:23:30 2013
@@ -797,17 +797,22 @@ public class MessageImplTest extends Qpi
         assertNull(_testAmqpMessage.getAbsoluteExpiryTime());
     }
 
+    /**
+     * As we are basing getJMSExpiration for incoming messages on the ttl field if absolute-expiry-time is missing, and must not set
+     * absolute-expiry-time if JMSExpiration is 0, ensure that setting JMSExpiration to 0 results in getJMSExpiration
+     * returning 0 if an incoming message had only the ttl field set.
+     */
     @Test
-    public void testSetJMSExpirationToZeroOnRecievedMessageWithTtlSetsUnderlyingTtlNull() throws Exception
+    public void testSetJMSExpirationToZeroOnRecievedMessageWithTtlFieldsResultsInGetJMSExpirationReturningZero() throws Exception
     {
         long ttl = 789L;
         _testAmqpMessage.setTtl(ttl);
+
         _testMessage = new TestMessageImpl(_testAmqpMessage, _mockSessionImpl, _mockConnectionImpl, null);
 
         _testMessage.setJMSExpiration(0);
 
         assertEquals("expected JMSExpiration value not present", 0L, _testMessage.getJMSExpiration());
-        assertNull(_testAmqpMessage.getTtl());
     }
 
     /**



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org