[ 
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:[email protected]

Reply via email to