You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@activemq.apache.org by "Rômulo Coutinho (Jira)" <ji...@apache.org> on 2022/08/11 13:40:00 UTC

[jira] [Comment Edited] (ARTEMIS-3925) Last value queues only keeping last messages (regardless of last value key)

    [ https://issues.apache.org/jira/browse/ARTEMIS-3925?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17578477#comment-17578477 ] 

Rômulo Coutinho edited comment on ARTEMIS-3925 at 8/11/22 1:39 PM:
-------------------------------------------------------------------

This is my test case:

 
{code:java}
    /**
     * Tests last value messages.
     *
     * @throws Exception If the test fails.
     */
    @Test
    public void testLastVaue() throws Exception {
        // Makes sure there are no messages to consume before the test.
        Message message = this.jmsTemplateTestService.consumeMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, 100L);
        while (message != null) {
            message = this.jmsTemplateTestService.consumeMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, 100L);
        }        // Sends messages in a row.
        this.jmsTemplateTestService.sendMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, "message1" /* message */, null /* last value */, 0, 0);
        this.jmsTemplateTestService.sendMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, "message2", null, 0, 0);
        this.jmsTemplateTestService.sendMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, "message3", "teste2", 0, 0);
        this.jmsTemplateTestService.sendMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, "message4", "teste2", 0, 0);
        
        // Wait until all messages are sent and consumes them.
        this.jmsTemplateTestService.consumeMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, 1000L);
        this.jmsTemplateTestService.consumeMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, 1000L);
        this.jmsTemplateTestService.consumeMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, 1000L);
        this.jmsTemplateTestService.consumeMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, 1000L);
        
        // Last values messages should not be consumed twice,
        Assertions.assertTrue(JmsTemplateTestService.ACKED_MESSAGES.contains("message1"));
        Assertions.assertTrue(JmsTemplateTestService.ACKED_MESSAGES.contains("message2"));
        Assertions.assertTrue(!JmsTemplateTestService.ACKED_MESSAGES.contains("message3"));
        Assertions.assertTrue(JmsTemplateTestService.ACKED_MESSAGES.contains("message4"));
        
        // A new last value message should be consumed.
        this.jmsTemplateTestService.sendMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, "message5", "teste2", 0, 0);
        this.jmsTemplateTestService.consumeMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, 1000L);
        Assertions.assertTrue(JmsTemplateTestService.ACKED_MESSAGES.contains("message5"));
    }
{code}
 

It has some abstraction on it (spring boot and a helper class). If the test is not clear, let me know.

 

With version 2.23.1, test passes. Under 2.24.0, only the last message is consumed (message4). Even if the last value is not set.

 


was (Author: JIRAUSER294110):
This is my test case:

 
{code:java}
    /**
     * Tests last value messages.
     *
     * @throws Exception If the test fails.
     */
    @Test
    public void testLastVaue() throws Exception {
        // Makes sure there are no messages to consume before the test.
        Message message = this.jmsTemplateTestService.consumeMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, 100L);
        while (message != null) {
            message = this.jmsTemplateTestService.consumeMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, 100L);
        }        // Sends messages in a row.
        this.jmsTemplateTestService.sendMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, "message1" /* message */, null /* last value */, 0, 0);
        this.jmsTemplateTestService.sendMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, "message2", null, 0, 0);
        this.jmsTemplateTestService.sendMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, "message3", "teste2", 0, 0);
        this.jmsTemplateTestService.sendMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, "message4", "teste2", 0, 0);
        
        // Wait until all messages are sent and consumes them.
        this.jmsTemplateTestService.consumeMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, 1000L);
        this.jmsTemplateTestService.consumeMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, 1000L);
        this.jmsTemplateTestService.consumeMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, 1000L);
        this.jmsTemplateTestService.consumeMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, 1000L);
        
        // Last values messages should not be consumed twice,
        Assertions.assertTrue(JmsTemplateTestService.ACKED_MESSAGES.contains("message1"));
        Assertions.assertTrue(JmsTemplateTestService.ACKED_MESSAGES.contains("message2"));
        Assertions.assertTrue(!JmsTemplateTestService.ACKED_MESSAGES.contains("message3"));
        Assertions.assertTrue(JmsTemplateTestService.ACKED_MESSAGES.contains("message4"));
        
        // A new last value message should be consumed.
        this.jmsTemplateTestService.sendMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, "message5", "teste2", 0, 0);
        this.jmsTemplateTestService.consumeMessage(JmsTemplateTestService.JMS_TEMPLATE_TEST_QUEUE, 1000L);
        Assertions.assertTrue(JmsTemplateTestService.ACKED_MESSAGES.contains("message5"));
    }
{code}
 

It has some abstraction on it (spring boot and a helper class). If the test is not clear, let me know.

 

With version 2.23.1, test passes. Under 2.24.0, only the last message is consumed (message4).

 

> Last value queues only keeping last messages (regardless of last value key)
> ---------------------------------------------------------------------------
>
>                 Key: ARTEMIS-3925
>                 URL: https://issues.apache.org/jira/browse/ARTEMIS-3925
>             Project: ActiveMQ Artemis
>          Issue Type: Bug
>    Affects Versions: 2.24.0
>            Reporter: Rômulo Coutinho
>            Priority: Major
>
> Last value was working just as expected until version 2.23.1. We upgraded for 2.24.0 and only the last message is kept in the queue for consumption (even for different last values).



--
This message was sent by Atlassian Jira
(v8.20.10#820010)