Hi, i have done another experiment :
I have tried something to see the influence of messages on ActiveMQ
behavior.

I try to send 20 messages per seconds during 20 seconds into the broker and
use a processor to dequeue the messages.
If there is no other messages, it is ok
If i create a false queue with 16k messages it is always working
If i create a false queue with 24k messages it takes about 25 seconds to do
all the job.
If i create a false queue with 32k messages it takes about 55 seconds to do
all the job.

Is there something to do to avoid that a queue has an influence on other
queues?
Regards


2011/8/1 Hervé BARRAULT <herve.barra...@gmail.com>

> Hi,
> I have looked to the purge mechanism to try to understand why it takes so
> much time to clean a queue.
>
> I have noticed something :
>
> ####
> CLASS org.apache.activemq.store.jdbc.Statements
> public String getFindMessageSequenceIdStatement() {
>     if (findMessageSequenceIdStatement == null) {
>         findMessageSequenceIdStatement = "SELECT ID, PRIORITY FROM " +
> getFullMessageTableName()
>             + " WHERE MSGID_PROD=? AND MSGID_SEQ=? AND CONTAINER=?";
>     }
>     return findMessageSequenceIdStatement;
> }
>
> public String getRemoveMessageStatement() {
>         if (removeMessageStatement == null) {
>             removeMessageStatement = "DELETE FROM " +
> getFullMessageTableName() + " WHERE ID=?";
>         }
>         return removeMessageStatement;
>     }
> ###
>
> ###
> CLASS org.apache.activemq.store.jdbc.JDBCMessageStore
>
> private long getStoreSequenceIdForMessageId(MessageId messageId) throws
> IOException {
>         long result = -1;
>         TransactionContext c = persistenceAdapter.getTransactionContext();
>         try {
>             result = adapter.getStoreSequenceId(c, destination,
> messageId)[0];
>         } catch (SQLException e) {
>             JDBCPersistenceAdapter.log("JDBC Failure: ", e);
>             throw IOExceptionSupport.create("Failed to get store sequenceId
> for messageId: " + messageId +", on: " + destination + ". Reason: " + e, e);
>         } finally {
>             c.close();
>         }
>         return result;
>     }
>
> public void removeMessage(ConnectionContext context, MessageAck ack) throws
> IOException {
>
>         long seq = getStoreSequenceIdForMessageId(ack.getLastMessageId());
>
>         // Get a connection and remove the message from the DB
>         TransactionContext c =
> persistenceAdapter.getTransactionContext(context);
>         try {
>             adapter.doRemoveMessage(c, seq);
>         } catch (SQLException e) {
>             JDBCPersistenceAdapter.log("JDBC Failure: ", e);
>             throw IOExceptionSupport.create("Failed to broker message: " +
> ack.getLastMessageId() + " in container: " + e, e);
>         } finally {
>             c.close();
>         }
>     }
> ###
>
> Could it be better to use only one request to remove a row, which is :
> "DELETE FROM " + getFullMessageTableName() + " WHERE MSGID_PROD=? AND
> MSGID_SEQ=? AND CONTAINER=?" ?
> or is there a case where it is not working ?
>
> Could it be better to create an index based on MSGID_PROD, MSGID_SEQ and 
> CONTAINER
> (this index could be UNIQUE ?) ?
>
> I have checked that it takes 1min30 to dequeue my 16000 messages using the
> purge method with these two modifications. I noticed that the page size is
> 200 messages and it waits every 200 row to read from the database to be able
> to purge it, i never noticed this limit before.
>
> So it increases the rate from about 40 msgs/sec to about 170 msgs/sec to
> purge a queue (does it can also apply to other components reading the queue
> ?).
>
> I don't have enough JMS broker and database mechanism knowledges to say if
> it is a good or a bad idea.
>
> Anyone can help me for this ?
>
> Thanks for answers.
> Hervé
>
>
> 2011/7/29 Hervé BARRAULT <herve.barra...@gmail.com>
>
>> Hi,
>> I am using ActiveMQ 5.4.0 with persistence (using an oracle 11g R2 server)
>> and i am doing some performance tests.
>>
>> I'm sending 16000 messages through web services (using one port) and it
>> takes about 1 min to manage all messages and fill the JMS queue.
>>
>> When i use a consumer to dequeue this queue (without adding new messages)
>> and fill another one, it takes about 6 min and 30 seconds. I was expecting
>> that i have some code which slow down the consumption.
>>
>> But i have tried to use the purge method and it takes the same time.
>>
>> Is there a way to increase the consumption rate ?
>>
>> Thanks for answers.
>>
>
>

Reply via email to