You are viewing a plain text version of this content. The canonical link for it is here.
Posted to gitbox@activemq.apache.org by GitBox <gi...@apache.org> on 2021/05/17 15:01:25 UTC

[GitHub] [activemq-artemis] clebertsuconic commented on a change in pull request #3583: ARTEMIS-3285 potential duplicate messages with LVQ + non-destructive

clebertsuconic commented on a change in pull request #3583:
URL: https://github.com/apache/activemq-artemis/pull/3583#discussion_r633610097



##########
File path: tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/JMSNonDestructiveTest.java
##########
@@ -588,4 +599,87 @@ private void sendLVQTombstone(ConnectionSupplier producerConnectionSupplier, Str
          producer.send(message1, javax.jms.Message.DEFAULT_DELIVERY_MODE, javax.jms.Message.DEFAULT_PRIORITY, tombstoneTimeToLive);
       }
    }
+
+   @Test
+   public void testMultipleLastValuesCore() throws Exception {
+      testMultipleLastValues(CoreConnection);
+   }
+
+   @Test
+   public void testMultipleLastValuesAMQP() throws Exception {
+      testMultipleLastValues(AMQPConnection);
+   }
+
+   private void testMultipleLastValues(ConnectionSupplier connectionSupplier) throws Exception {
+      HashMap<String, List<String>> results = new HashMap<>();
+      results.put("0", new ArrayList<>());
+      results.put("1", new ArrayList<>());
+      results.put("2", new ArrayList<>());
+      HashMap<String, Integer> dups = new HashMap<>();
+
+      try (Connection connection = connectionSupplier.createConnection();
+           Connection connection2 = connectionSupplier.createConnection()) {
+         Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
+         Session session2 = connection2.createSession(false, Session.CLIENT_ACKNOWLEDGE);
+
+         Queue queue = session.createQueue(NON_DESTRUCTIVE_LVQ_QUEUE_NAME);
+
+         MessageProducer producer = session2.createProducer(queue);
+         MessageConsumer consumer = session.createConsumer(queue);
+         connection.start();
+
+         Thread t = new Thread(() -> {
+            for (int i = 0; i < 100; i++) {
+               String lastval = "" + (i % 3);
+               try {
+                  TextMessage message = session2.createTextMessage();
+                  message.setText("" + i);
+                  message.setStringProperty("data", "" + i);
+                  message.setStringProperty("lastval", lastval);
+                  message.setStringProperty(Message.HDR_LAST_VALUE_NAME.toString(), lastval);
+                  producer.send(message);
+               } catch (JMSException e) {
+                  e.printStackTrace();
+               }
+            }
+         });
+
+         t.start();
+         while (true) {
+            TextMessage tm = (TextMessage) consumer.receive(500);
+            if (tm == null) {
+               break;
+            }
+            results.get(tm.getStringProperty("lastval")).add(tm.getText());
+            tm.acknowledge();
+         }
+      }
+      for (Map.Entry<String, List<String>> entry : results.entrySet()) {
+         StringBuilder message = new StringBuilder();
+         message.append("Messages received with lastval=" + entry.getKey() + " (");
+         for (String s : entry.getValue()) {
+            int occurrences = Collections.frequency(entry.getValue(), s);
+            if (occurrences > 1 && !dups.containsValue(Integer.parseInt(s))) {
+               dups.put(s, occurrences);
+            }
+            message.append(s + ",");
+         }
+         logger.info(message + ")");
+
+      }
+      if (dups.size() > 0) {
+         StringBuffer sb = new StringBuffer();
+         for (Map.Entry<String, Integer> stringIntegerEntry : dups.entrySet()) {
+            sb.append(stringIntegerEntry.getKey() + "(" + stringIntegerEntry.getValue() + "),");
+         }
+         Assert.fail("Duplicate messages received " + sb);
+      }
+
+      if (persistenceEnabled) {
+         Wait.assertTrue(() -> {

Review comment:
       why the check on persistenceEnabled? Is the test running more than once?




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org