[
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]