qpid-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rajith Attapattu (Commented) (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (QPID-3562) the 0-10 client path does not act as expected with asynchronous consumers using a prefetch of 1 on transacted sessions
Date Wed, 16 Nov 2011 17:33:51 GMT

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

Rajith Attapattu commented on QPID-3562:
----------------------------------------

I have the following test case for prefetch=0 & prefetch=1
I don't believe it covers all cases. I'd appreciate some feedback on the test.

{code}
    /**
     * Test Goal : For prefetch 0, verify that the client does not get any messages unless
receive() is called.
     *             For prefetch 1, verify that the client gets only 1 message and not more
than that. 
     *             
     * Test Strategy: Create two consumers on the same queue, one with prefetch disabled (zero)
and one with prefetch=1.
     *                Note : Created the one with prefetch disabled first.
     *                Send a single message to the queue and verify that the message only
goes to the one with prefetch=1.
     *                
     *                Next, send 3 messages
     */
    public void testPrefetchZeroAndOneWithSyncReceive() throws Exception
    {
        setTestClientSystemProperty(ClientProperties.MAX_PREFETCH_PROP_NAME, "0");
        Connection con = getConnection();
        con.start();
        Session ssn = con.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Destination destWithZeroCapacity = ssn.createQueue("ADDR:my-queue;{create: always}");
        
        MessageProducer prod = ssn.createProducer(destWithZeroCapacity);
        prod.send(ssn.createTextMessage("Msg"));
        
        MessageConsumer consumerWithZeroPrefetch = ssn.createConsumer(destWithZeroCapacity);
        
        Destination destWithPrefetchEnabled = ssn.createQueue("ADDR:my-queue;{create: always,
link:{capacity:1}}");
        MessageConsumer consumerWithPretch = ssn.createConsumer(destWithPrefetchEnabled);
        TextMessage msg = (TextMessage)consumerWithPretch.receive(1000);
        assertNotNull("The message should only go to the consumer with prefetch enabled",msg);
                
        for (int i=0; i<5;i++) 
        {
           prod.send(ssn.createTextMessage("Msg" + i));
        }
        
        msg = (TextMessage)consumerWithZeroPrefetch.receive(1000);
        assertNotNull("When receive is called a message should be fetched from the broker",msg);
        assertEquals("Consumer with zero prefetch should receive Msg1, " +
        		"as Msg 0 is given to the consumer with prefetch=1",msg.getText(),"Msg1");
        
        // Verify that the other 2 messages have not been given to the consumer with zero
prefetch.
        for (int i=0; i<2; i++)
        {
            int j = i + i*1; // done to get Msg0 & Msg2, skipping Msg1.
            msg = (TextMessage)consumerWithPretch.receive(1000);
            assertNotNull("The consumer with prefetch enabled should receive the message",msg);
            assertEquals("The consumer with prefetch enabled should receive Msg" + j,msg.getText(),"Msg"+j);
        }
        
        // Verify that the prefetch=1 consumer has not accumulated more messages than it should
due to errors.
        // Note Msg3 should be in "consumer with prefetch=1" (in it's prefetch buffer), but
Msg4 should not be.
        msg = (TextMessage)consumerWithZeroPrefetch.receive(1000);
        assertNotNull("When receive is called a message should be fetched from the broker",msg);
        assertEquals("Consumer with zero prefetch should receive Msg4 ",msg.getText(),"Msg4");
    }
{code}
                
> the 0-10 client path does not act as expected with asynchronous consumers using a prefetch
of 1 on transacted sessions
> ----------------------------------------------------------------------------------------------------------------------
>
>                 Key: QPID-3562
>                 URL: https://issues.apache.org/jira/browse/QPID-3562
>             Project: Qpid
>          Issue Type: Bug
>          Components: Java Client
>    Affects Versions: 0.12
>            Reporter: Robbie Gemmell
>            Assignee: Robbie Gemmell
>             Fix For: 0.13
>
>
> the 0-10 client path does not act as expected with asynchronous consumers using a prefetch
of 1 on transacted sessions, as the client is able to hold a 2nd message during processing
of a slow onMessage handler. This is because completions are sent to ensure credit does not
dry up, allowing a large-than-prefetch number of messages to be consume in a given transaction.
However, this is done prior to delivery to the client application, which causes the client
to get sent a 2nd message by the broker.
> This should isntead occur after delivery has completed (if it is necessary: the client
may have committed, which sends accepting completions anyway) to give the expected behaviour.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:dev-subscribe@qpid.apache.org


Mime
View raw message