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 2014/09/26 14:08:27 UTC

[1/2] git commit: update envelope toString/equals/hashCode implementations, add sequence number and tweak facade to avoid message-id conversion cost for envelope use

Repository: qpid-jms
Updated Branches:
  refs/heads/master 63ab8c1bc -> 191fa4ce1


update envelope toString/equals/hashCode implementations, add sequence number and tweak facade to avoid message-id conversion cost for envelope use


Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/82b0842a
Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/82b0842a
Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/82b0842a

Branch: refs/heads/master
Commit: 82b0842a1f5d9a4cdd48b5e49c3d57245112614e
Parents: 63ab8c1
Author: Robert Gemmell <ro...@apache.org>
Authored: Fri Sep 26 12:14:09 2014 +0100
Committer: Robert Gemmell <ro...@apache.org>
Committed: Fri Sep 26 12:14:09 2014 +0100

----------------------------------------------------------------------
 .../jms/message/JmsInboundMessageDispatch.java  | 68 ++++++++++++++++----
 .../jms/message/facade/JmsMessageFacade.java    | 12 ++++
 .../defaults/JmsDefaultMessageFacade.java       |  5 ++
 .../qpid/jms/provider/amqp/AmqpConsumer.java    | 12 +++-
 .../jms/provider/amqp/AmqpQueueBrowser.java     |  4 +-
 .../amqp/message/AmqpJmsMessageFacade.java      |  8 ++-
 6 files changed, 88 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/82b0842a/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/JmsInboundMessageDispatch.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/JmsInboundMessageDispatch.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/JmsInboundMessageDispatch.java
index 46bd4d5..94a99b2 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/JmsInboundMessageDispatch.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/JmsInboundMessageDispatch.java
@@ -22,11 +22,17 @@ import org.apache.qpid.jms.meta.JmsConsumerId;
 /**
  * Envelope used to deliver incoming messages to their targeted consumer.
  */
-public class JmsInboundMessageDispatch extends JmsAbstractResourceId{
+public class JmsInboundMessageDispatch extends JmsAbstractResourceId {
 
     private JmsConsumerId consumerId;
+    private Object messageId;
+    private long sequence;
     private JmsMessage message;
-    private String dispatchId;
+
+    public JmsInboundMessageDispatch(long sequence)
+    {
+        this.sequence = sequence;
+    }
 
     public JmsMessage getMessage() {
         return message;
@@ -48,23 +54,59 @@ public class JmsInboundMessageDispatch extends JmsAbstractResourceId{
         this.message.incrementRedeliveryCount();
     }
 
-    public void setDispatchId(String dispatchId)
-    {
-        this.dispatchId = dispatchId;
+    public void setMessageId(Object object) {
+        this.messageId = object;
     }
 
     @Override
     public String toString() {
-        String result = "JmsInboundMessageDispatch {dispatchId = ";
-        String id = dispatchId;
-        if (id == null) {
-            result = result + "<null>}";
-        } else {
-            result = result + id + "}";
-        }
+        return "JmsInboundMessageDispatch {sequence = " + sequence
+                                      + ", messageId = " + messageId
+                                      + ", consumerId = " + consumerId
+                                      + "}";
+    }
 
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((consumerId == null) ? 0 : consumerId.hashCode());
+        result = prime * result + ((messageId == null) ? 0 : messageId.hashCode());
+        result = prime * result + (int) (sequence ^ (sequence >>> 32));
         return result;
     }
 
-    //TODO: equals and hashcode?
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj == null || getClass() != obj.getClass()) {
+            return false;
+        }
+
+        JmsInboundMessageDispatch other = (JmsInboundMessageDispatch) obj;
+        if (sequence != other.sequence) {
+            return false;
+        }
+
+        if (messageId == null) {
+            if (other.messageId != null) {
+                return false;
+            }
+        } else if (!messageId.equals(other.messageId)) {
+            return false;
+        }
+
+        if (consumerId == null) {
+            if (other.consumerId != null) {
+                return false;
+            }
+        } else if (!consumerId.equals(other.consumerId)) {
+            return false;
+        }
+
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/82b0842a/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/facade/JmsMessageFacade.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/facade/JmsMessageFacade.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/facade/JmsMessageFacade.java
index c2d9e8a..9f4717d 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/facade/JmsMessageFacade.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/facade/JmsMessageFacade.java
@@ -129,6 +129,8 @@ public interface JmsMessageFacade {
 
     /**
      * Returns the correlation ID set on this message if one exists, null otherwise.
+     * The returned value will include the JMS mandated 'ID:' prefix if the value
+     * represents a JMSMessageID rather than an application-specific string.
      *
      * @return the set correlation ID or null if not set.
      */
@@ -165,12 +167,22 @@ public interface JmsMessageFacade {
 
     /**
      * Returns the message ID set on this message if one exists, null otherwise.
+     * The returned value will include the JMS mandated 'ID:' prefix.
      *
      * @return the set message ID or null if not set.
      */
     String getMessageId();
 
     /**
+     * Returns the underlying providers message ID object for this message if one
+     * exists, null otherwise. In the case the returned value is a String, it is not
+     * defined whether the JMS mandated 'ID:' prefix will be present.
+     *
+     * @return the set provider message ID or null if not set.
+     */
+    Object getProviderMessageIdObject();
+
+    /**
      * Sets the message ID for this message.
      *
      * @param messageId

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/82b0842a/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/facade/defaults/JmsDefaultMessageFacade.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/facade/defaults/JmsDefaultMessageFacade.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/facade/defaults/JmsDefaultMessageFacade.java
index 32e501a..330ddfb 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/facade/defaults/JmsDefaultMessageFacade.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/facade/defaults/JmsDefaultMessageFacade.java
@@ -148,6 +148,11 @@ public class JmsDefaultMessageFacade implements JmsMessageFacade {
     }
 
     @Override
+    public Object getProviderMessageIdObject() {
+        return messageId;
+    }
+
+    @Override
     public void setMessageId(String messageId) {
         this.messageId = messageId;
     }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/82b0842a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpConsumer.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpConsumer.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpConsumer.java
index d827287..57c6b35 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpConsumer.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpConsumer.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
 
 import javax.jms.JMSException;
 
@@ -74,6 +75,8 @@ public class AmqpConsumer extends AbstractAmqpResource<JmsConsumerInfo, Receiver
     private final ByteArrayOutputStream streamBuffer = new ByteArrayOutputStream();
     private final byte incomingBuffer[] = new byte[1024 * 64];
 
+    private AtomicLong _incomingSequence = new AtomicLong(0);
+
     public AmqpConsumer(AmqpSession session, JmsConsumerInfo info) {
         super(info);
         this.session = session;
@@ -335,13 +338,12 @@ public class AmqpConsumer extends AbstractAmqpResource<JmsConsumerInfo, Receiver
         // mode and the consumer will see it as a normal received message.
         message.onSend();
 
-        JmsInboundMessageDispatch envelope = new JmsInboundMessageDispatch();
+        JmsInboundMessageDispatch envelope = new JmsInboundMessageDispatch(getNextIncomingSequenceNumber());
         envelope.setMessage(message);
         envelope.setConsumerId(info.getConsumerId());
         // Store link to delivery in the hint for use in acknowledge requests.
         envelope.setProviderHint(incoming);
-        //TODO: the below messageId retrieval may result in type conversion costs
-        envelope.setDispatchId(message.getJMSMessageID());
+        envelope.setMessageId(message.getFacade().getProviderMessageIdObject());
 
         // Store reference to envelope in delivery context for recovery
         incoming.setContext(envelope);
@@ -349,6 +351,10 @@ public class AmqpConsumer extends AbstractAmqpResource<JmsConsumerInfo, Receiver
         deliver(envelope);
     }
 
+    protected long getNextIncomingSequenceNumber() {
+        return _incomingSequence.incrementAndGet();
+    }
+
     @Override
     protected void doClose() {
     }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/82b0842a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpQueueBrowser.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpQueueBrowser.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpQueueBrowser.java
index e23b4c0..10e165b 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpQueueBrowser.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpQueueBrowser.java
@@ -75,7 +75,7 @@ public class AmqpQueueBrowser extends AmqpConsumer {
     @Override
     public void processFlowUpdates() throws IOException {
         if (endpoint.getDrain() && endpoint.getCredit() == endpoint.getRemoteCredit()) {
-            JmsInboundMessageDispatch browseDone = new JmsInboundMessageDispatch();
+            JmsInboundMessageDispatch browseDone = new JmsInboundMessageDispatch(getNextIncomingSequenceNumber());
             browseDone.setConsumerId(getConsumerId());
             try {
                 deliver(browseDone);
@@ -99,7 +99,7 @@ public class AmqpQueueBrowser extends AmqpConsumer {
         super.processDeliveryUpdates();
 
         if (endpoint.getDrain() && endpoint.getCredit() == endpoint.getRemoteCredit()) {
-            JmsInboundMessageDispatch browseDone = new JmsInboundMessageDispatch();
+            JmsInboundMessageDispatch browseDone = new JmsInboundMessageDispatch(getNextIncomingSequenceNumber());
             browseDone.setConsumerId(getConsumerId());
             try {
                 deliver(browseDone);

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/82b0842a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java
index aa34d24..5eb5ede 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java
@@ -312,9 +312,6 @@ public class AmqpJmsMessageFacade implements JmsMessageFacade {
 
         // Ensure the ID: prefix is present.
         // TODO: should we always do this when non-null? AMQP JMS Mapping says never to send the "ID:" prefix.
-        // TODO: should we make this part of the JmsMessageId, or JmsMessage object responsibilities?
-        //       I Ended up putting it in JmsMessage after the above comment, as a workaround for the
-        //       current JmsDefaultMessageFacade usage.
         if (baseStringId != null && !helper.hasMessageIdPrefix(baseStringId)) {
             baseStringId = AmqpMessageIdHelper.JMS_ID_PREFIX + baseStringId;
         }
@@ -322,6 +319,11 @@ public class AmqpJmsMessageFacade implements JmsMessageFacade {
     }
 
     @Override
+    public Object getProviderMessageIdObject() {
+        return message.getMessageId();
+    }
+
+    @Override
     public void setMessageId(String messageId) {
         if (messageId == null) {
             message.setMessageId(null);


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


[2/2] git commit: add some tests for JmsInboundMessageDispatch

Posted by ro...@apache.org.
add some tests for JmsInboundMessageDispatch


Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/191fa4ce
Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/191fa4ce
Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/191fa4ce

Branch: refs/heads/master
Commit: 191fa4ce12a78494cd7804a7800c5d5bf829dca1
Parents: 82b0842
Author: Robert Gemmell <ro...@apache.org>
Authored: Fri Sep 26 12:45:58 2014 +0100
Committer: Robert Gemmell <ro...@apache.org>
Committed: Fri Sep 26 12:45:58 2014 +0100

----------------------------------------------------------------------
 .../message/JmsInboundMessageDispatchTest.java  | 185 +++++++++++++++++++
 1 file changed, 185 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/191fa4ce/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/JmsInboundMessageDispatchTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/JmsInboundMessageDispatchTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/JmsInboundMessageDispatchTest.java
new file mode 100644
index 0000000..f40f3b2
--- /dev/null
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/JmsInboundMessageDispatchTest.java
@@ -0,0 +1,185 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.qpid.jms.message;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.UUID;
+
+import org.apache.qpid.jms.meta.JmsConsumerId;
+import org.apache.qpid.jms.meta.JmsSessionId;
+import org.apache.qpid.proton.amqp.Binary;
+import org.apache.qpid.proton.amqp.UnsignedLong;
+import org.junit.Test;
+
+public class JmsInboundMessageDispatchTest {
+
+    @Test
+    public void testEqualAndHashCodeWithSameSequenceOnly() {
+        int sequence = 1;
+        JmsInboundMessageDispatch envelope1 = new JmsInboundMessageDispatch(sequence);
+        JmsInboundMessageDispatch envelope2 = new JmsInboundMessageDispatch(sequence);
+
+        assertTrue("objects should be equal", envelope1.equals(envelope2));
+        assertTrue("objects should still be equal", envelope2.equals(envelope1));
+
+        assertEquals("hashCodes should be the same", envelope1.hashCode(), envelope2.hashCode());
+    }
+
+    @Test
+    public void testEqualAndHashCodeWithDifferentSequenceOnly() {
+        int sequence = 1;
+        JmsInboundMessageDispatch envelope1 = new JmsInboundMessageDispatch(sequence);
+        JmsInboundMessageDispatch envelope2 = new JmsInboundMessageDispatch(sequence + 1);
+
+        assertFalse("objects should not be equal", envelope1.equals(envelope2));
+        assertFalse("objects should still not be equal", envelope2.equals(envelope1));
+
+        // Not strictly a requirement, but expected in this case
+        assertNotEquals("hashCodes should not be the same", envelope1.hashCode(), envelope2.hashCode());
+    }
+
+    @Test
+    public void testEqualAndHashCodeWithSameSequenceDifferentConsumerId() {
+        JmsSessionId sessionId = new JmsSessionId("con", 1);
+
+        long sequence = 1;
+        JmsInboundMessageDispatch envelope1 = new JmsInboundMessageDispatch(sequence);
+        JmsConsumerId consumerId1 = new JmsConsumerId(sessionId, 1);
+        envelope1.setConsumerId(consumerId1);
+
+        JmsInboundMessageDispatch envelope2 = new JmsInboundMessageDispatch(sequence);
+        JmsConsumerId consumerId2 = new JmsConsumerId(sessionId, 2);
+        envelope2.setConsumerId(consumerId2);
+
+        assertFalse("objects should not be equal", envelope1.equals(envelope2));
+        assertFalse("objects should still not be equal", envelope2.equals(envelope1));
+
+        // Not strictly a requirement, but expected in this case
+        assertNotEquals("hashCodes should not be the same", envelope1.hashCode(), envelope2.hashCode());
+    }
+
+    @Test
+    public void testEqualAndHashCodeWithSameSequenceSameConsumerId() {
+        JmsSessionId sessionId = new JmsSessionId("con", 1);
+        JmsConsumerId consumerId = new JmsConsumerId(sessionId, 1);
+
+        long sequence = 1;
+        JmsInboundMessageDispatch envelope1 = new JmsInboundMessageDispatch(sequence);
+        envelope1.setConsumerId(consumerId);
+
+        JmsInboundMessageDispatch envelope2 = new JmsInboundMessageDispatch(sequence);
+        envelope2.setConsumerId(consumerId);
+
+        assertTrue("objects should be equal", envelope1.equals(envelope2));
+        assertTrue("objects should still be equal", envelope2.equals(envelope1));
+
+        assertEquals("hashCodes should be the same", envelope1.hashCode(), envelope2.hashCode());
+    }
+
+    @Test
+    public void testEqualAndHashCodeWithSameSequenceSameConsumerIdSameMessageId() {
+        JmsSessionId sessionId = new JmsSessionId("con", 1);
+        JmsConsumerId consumerId = new JmsConsumerId(sessionId, 1);
+        Object messageId = "myMessageId";
+
+        long sequence = 1;
+        JmsInboundMessageDispatch envelope1 = new JmsInboundMessageDispatch(sequence);
+        envelope1.setConsumerId(consumerId);
+        envelope1.setMessageId(messageId);
+
+        JmsInboundMessageDispatch envelope2 = new JmsInboundMessageDispatch(sequence);
+        envelope2.setConsumerId(consumerId);
+        envelope2.setMessageId(messageId);
+
+        assertTrue("objects should be equal", envelope1.equals(envelope2));
+        assertTrue("objects should still be equal", envelope2.equals(envelope1));
+
+        assertEquals("hashCodes should be the same", envelope1.hashCode(), envelope2.hashCode());
+    }
+
+    @Test
+    public void testEqualAndHashCodeWithSameSequenceSameConsumerIdDifferentMessageIdTypes() {
+        JmsSessionId sessionId = new JmsSessionId("con", 1);
+        JmsConsumerId consumerId = new JmsConsumerId(sessionId, 1);
+        Object messageId1 = new Binary(new byte[] { (byte) 1, (byte) 0 });
+        Object messageId2 = UnsignedLong.valueOf(2);
+
+        long sequence = 1;
+        JmsInboundMessageDispatch envelope1 = new JmsInboundMessageDispatch(sequence);
+        envelope1.setConsumerId(consumerId);
+        envelope1.setMessageId(messageId1);
+
+        JmsInboundMessageDispatch envelope2 = new JmsInboundMessageDispatch(sequence);
+        envelope2.setConsumerId(consumerId);
+        envelope2.setMessageId(messageId2);
+
+        assertFalse("objects should not be equal", envelope1.equals(envelope2));
+        assertFalse("objects should still not be equal", envelope2.equals(envelope1));
+
+        // Not strictly a requirement, but expected in this case
+        assertNotEquals("hashCodes should not be the same", envelope1.hashCode(), envelope2.hashCode());
+    }
+
+    @Test
+    public void testEqualAndHashCodeWithSameSequenceSameConsumerIdDifferentMessageIdTypes2() {
+        JmsSessionId sessionId = new JmsSessionId("con", 1);
+        JmsConsumerId consumerId = new JmsConsumerId(sessionId, 1);
+        Object messageId1 = UUID.randomUUID();
+        Object messageId2 = messageId1.toString();
+
+        long sequence = 1;
+        JmsInboundMessageDispatch envelope1 = new JmsInboundMessageDispatch(sequence);
+        envelope1.setConsumerId(consumerId);
+        envelope1.setMessageId(messageId1);
+
+        JmsInboundMessageDispatch envelope2 = new JmsInboundMessageDispatch(sequence);
+        envelope2.setConsumerId(consumerId);
+        envelope2.setMessageId(messageId2);
+
+        assertFalse("objects should not be equal", envelope1.equals(envelope2));
+        assertFalse("objects should still not be equal", envelope2.equals(envelope1));
+
+        // Not strictly a requirement, but expected in this case
+        assertNotEquals("hashCodes should not be the same", envelope1.hashCode(), envelope2.hashCode());
+    }
+
+    @Test
+    public void testEqualAndHashCodeWithDifferentSequenceSameConsumerIdSameMessageId() {
+        JmsSessionId sessionId = new JmsSessionId("con", 1);
+        JmsConsumerId consumerId = new JmsConsumerId(sessionId, 1);
+        Object messageId = "myMessageId";
+
+        long sequence = 1;
+        JmsInboundMessageDispatch envelope1 = new JmsInboundMessageDispatch(sequence);
+        envelope1.setConsumerId(consumerId);
+        envelope1.setMessageId(messageId);
+
+        JmsInboundMessageDispatch envelope2 = new JmsInboundMessageDispatch(sequence + 1);
+        envelope2.setConsumerId(consumerId);
+        envelope2.setMessageId(messageId);
+
+        assertFalse("objects should not be equal", envelope1.equals(envelope2));
+        assertFalse("objects should still not be equal", envelope2.equals(envelope1));
+
+        // Not strictly a requirement, but expected in this case
+        assertNotEquals("hashCodes should not be the same", envelope1.hashCode(), envelope2.hashCode());
+    }
+}


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