This morning I got a lot of these exceptions in our server log. What could be the cause ? Any thoughts ?

It appears that once these start happening it cannot consume any more messages off the queue even after a restart. I had to delete activemq-data directory and restart, but this means we lost messages.


012-09-25 05:25:48,446 ERROR [BrokerService[localhost] Task-2008] org.apache.activemq.broker.region.cursors.AbstractSto reCursor.fillBatch(AbstractStoreCursor.java:262) - QueueStorePrefetch1291856639 - Failed to fill batch
java.lang.NullPointerException
at org.apache.kahadb.index.BTreeNode$BTreeIterator.findNextPage(BTreeNode.java:110) at org.apache.kahadb.index.BTreeNode$BTreeIterator.hasNext(BTreeNode.java:121) at org.apache.activemq.store.kahadb.MessageDatabase$MessageOrderIndex$MessageOrderIterator.hasNext(MessageDatabase.java:2344) at org.apache.activemq.store.kahadb.KahaDBStore$KahaDBMessageStore$5.execute(KahaDBStore.java:491)
       at org.apache.kahadb.page.Transaction.execute(Transaction.java:728)
at org.apache.activemq.store.kahadb.KahaDBStore$KahaDBMessageStore.recoverNextMessages(KahaDBStore.java:485) at org.apache.activemq.store.ProxyMessageStore.recoverNextMessages(ProxyMessageStore.java:88) at org.apache.activemq.broker.region.cursors.QueueStorePrefetch.doFillBatch(QueueStorePrefetch.java:97) at org.apache.activemq.broker.region.cursors.AbstractStoreCursor.fillBatch(AbstractStoreCursor.java:260) at org.apache.activemq.broker.region.cursors.AbstractStoreCursor.reset(AbstractStoreCursor.java:108) at org.apache.activemq.broker.region.cursors.StoreQueueCursor.reset(StoreQueueCursor.java:157) at org.apache.activemq.broker.region.Queue.doPageInForDispatch(Queue.java:1712) at org.apache.activemq.broker.region.Queue.pageInMessages(Queue.java:1932)
       at org.apache.activemq.broker.region.Queue.iterate(Queue.java:1440)
at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:127) at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
       at java.lang.Thread.run(Thread.java:662)


Inspecting the code I see this:

               while( current!=null ) {
                   if( nextIndex >= current.keys.length ) {
                       // we need to roll to the next leaf..
                       if( current.next >= 0 ) {
                           current = index.loadNode(tx, current.next, null);
assert !current.isBranch() : "Should have linked to the next leaf node.";
                           nextIndex=0;
                       } else {
                           break;
                       }
                   }  else {
nextEntry = new KeyValueEntry(current.keys[nextIndex], current.values[nextIndex]);
                       nextIndex++;
                       break;
                   }

               }

But looking at this, I don't see how can there be an NPE on the line that says this:

nextEntry = new KeyValueEntry(current.keys[nextIndex], current.values[nextIndex]);


(that happens to be line 110)…

Any help is greatly appreciated.




--
Regards,
Oleg Dulin
NYC Java Big Data Engineer
http://www.olegdulin.com/


Reply via email to