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