Hi,

While investigating performance related issues, we discovered that once Artemis 
JMS queue starts paging, newly produced message are not visible (within 60 
seconds receive timeout) until most of the messages in the front (of that 
queue) are consumed.



We have Artemis (2.11.0) in production as JMS broker with 16G memory, where 
<max-size-bytes>-1</max-size-bytes> &  
<address-full-policy>PAGE</address-full-policy>.



The following pseudo code is used to reproduce what we have experienced, in 
both Artemis (2.11.0) and Artemis (2.19.0):

  1.  The first parameter "conn" in those methods stands for the JMS connection.
  2.  The color parameter ('RED' and 'BLUE')  is used as message property.
  3.  The 'produce' method produces TextMessage with given color property.
  4.  The 'consume' method receives TextMessage of the given color property 
(using message SELECTOR), where receive timeout is 60 seconds
  5.  The 'clearMessage' clears the queue of messages of respective color





//1. clear all red messages

clearMessage(conn, queueName, "RED");



//2. clear all blue messages

clearMessage(conn, queueName, "BLUE");



//3. seeding the queue with 500_000 red messages, no paging yet

produce(conn, queueName, 500_000, "RED");



//4. produce 100 blue messages

produce(conn, queueName, 100, "BLUE") ;



//5. verify that one can successfully consume those 100 blue messages

consume(conn, queueName, 100, "BLUE");



//6. seeding another 9_000_000 red messages, to trigger paging

produce(conn, queueName, 9_000_000, "RED");



//7. produce 100 blue messages

produce(conn, queueName, 100, "BLUE");



//8. verify that one cannot receive those 100 blue messages within receive 
timeout 60 seconds

consume(conn, queueName, 100, "BLUE");



//9. consume 9_400_000 red messages to clear those in front of blue messages.

//   After this, there are 100_000 red messages in front of blue ones

consume(conn, queueName, 9_400_000, "RED");



//10. verify that it still cannot receive those 100 blue messages within 
receive timeout 60 seconds.

//     Even though this time there are only 100_00 red messages in front of 
blue ones

consume(conn, queueName, 100, "BLUE");



//11. consume anther 90_000 red messages to further clear those in front of 
blue messages,

//    After this, there are only 10_000 red messages in front of blue ones.

consume(conn, queueName, 90_000, "RED");



//12. yet, one still could not receive those 100 blue message within receive 
timeout 60 seconds.

//    This time there are only 10_000 red messages in front of them.

consume(conn, queueName, 100, "BLUE");



//13. consume anther 9_000 red messages to further clear those in front of blue 
messages,

//   After this, there are only 1_000 red messages in front of blue ones.

consume(conn, queueName, 9_000, "RED");



//14. finally, one can consumer those 100 blues messages, yes there are still 
1_000 reds one in front them

consume(conn, queueName, 100, "BLUE");



Questions:

  1.  is there any configuration setting one can apply to alter this behavior?
  2.  Or this is a known 'issue'. If it is, any plan to rectify in the near 
future?



Thank you very much for your help,

Youyu




The information in this e-mail communication together with any attachments is 
intended only for the person or entity to which it is addressed and may contain 
confidential and/or privileged material. If you are not the intended recipient 
of this e-mail communication, please notify us immediately. Any views expressed 
in this e-mail communication are those of the individual sender, unless 
otherwise specifically stated. Charles River Development does not represent, 
warrant or guarantee that the integrity of this communication has been 
maintained or that the communication is free of errors, virus or interference.


Information Classification *General

Reply via email to