服务器重新启动后JMS队列损坏,抛出java.lang.ClassCastException

服务器重新启动后JMS队列损坏,抛出java.lang.ClassCastException,java,jakarta-ee,jms,activemq,Java,Jakarta Ee,Jms,Activemq,我正在Tomcat中使用嵌入式JMS(ActiveMQ)。服务器关闭并重新启动时,现在显示错误: ERROR | org.apache.activemq.broker.region.cursors.QueueStorePrefetch@3443416b:MyQueue,batchResetNeeded=false,size=1,cacheEnabled=false,maxBatchSize:1,hasSpace:true,pendingCachedIds.size:0,lastSyncCache

我正在Tomcat中使用嵌入式JMS(ActiveMQ)。服务器关闭并重新启动时,现在显示错误:

ERROR | org.apache.activemq.broker.region.cursors.QueueStorePrefetch@3443416b:MyQueue,batchResetNeeded=false,size=1,cacheEnabled=false,maxBatchSize:1,hasSpace:true,pendingCachedIds.size:0,lastSyncCachedId:null,lastSyncCachedId-seq:null,lastAsyncCachedId:null,lastAsyncCachedId-seq:null,store=permits:10000,sd=nextSeq:1,lastRet:MessageOrderCursor:[def:0, low:0, high:0],pending:0 - Failed to fill batch
java.lang.ClassCastException: org.apache.activemq.store.kahadb.data.KahaTraceCommand cannot be cast to org.apache.activemq.store.kahadb.data.KahaAddMessageCommand
        at org.apache.activemq.store.kahadb.KahaDBStore.loadMessage(KahaDBStore.java:1248)
        at org.apache.activemq.store.kahadb.KahaDBStore$KahaDBMessageStore$4.execute(KahaDBStore.java:593)
        at org.apache.activemq.store.kahadb.disk.page.Transaction.execute(Transaction.java:779)
        at org.apache.activemq.store.kahadb.KahaDBStore$KahaDBMessageStore.recoverNextMessages(KahaDBStore.java:582)
        at org.apache.activemq.store.ProxyMessageStore.recoverNextMessages(ProxyMessageStore.java:110)
        at org.apache.activemq.broker.region.cursors.QueueStorePrefetch.doFillBatch(QueueStorePrefetch.java:120)
        at org.apache.activemq.broker.region.cursors.AbstractStoreCursor.fillBatch(AbstractStoreCursor.java:420)
        at org.apache.activemq.broker.region.cursors.AbstractStoreCursor.reset(AbstractStoreCursor.java:163)
        at org.apache.activemq.broker.region.cursors.StoreQueueCursor.reset(StoreQueueCursor.java:169)
        at org.apache.activemq.broker.region.Queue.doPageInForDispatch(Queue.java:1941)
        at org.apache.activemq.broker.region.Queue.pageInMessages(Queue.java:2170)
        at org.apache.activemq.broker.region.Queue.iterate(Queue.java:1607)
        at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
        at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:748)
ERROR | org.apache.activemq.broker.region.cursors.QueueStorePrefetch@3443416b:MyQueue,batchResetNeeded=false,size=1,cacheEnabled=false,maxBatchSize:1,hasSpace:true,pendingCachedIds.size:0,lastSyncCachedId:null,lastSyncCachedId-seq:null,lastAsyncCachedId:null,lastAsyncCachedId-seq:null,store=permits:10000,sd=nextSeq:1,lastRet:MessageOrderCursor:[def:0, low:0, high:0],pending:0 - Failed to fill batch
java.lang.RuntimeException: java.lang.ClassCastException: org.apache.activemq.store.kahadb.data.KahaTraceCommand cannot be cast to org.apache.activemq.store.kahadb.data.KahaAddMessageCommand
        at org.apache.activemq.broker.region.cursors.AbstractStoreCursor.fillBatch(AbstractStoreCursor.java:423)
        at org.apache.activemq.broker.region.cursors.AbstractStoreCursor.reset(AbstractStoreCursor.java:163)
        at org.apache.activemq.broker.region.cursors.StoreQueueCursor.reset(StoreQueueCursor.java:169)
        at org.apache.activemq.broker.region.Queue.doPageInForDispatch(Queue.java:1941)
        at org.apache.activemq.broker.region.Queue.pageInMessages(Queue.java:2170)
        at org.apache.activemq.broker.region.Queue.iterate(Queue.java:1607)
        at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
        at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassCastException: org.apache.activemq.store.kahadb.data.KahaTraceCommand cannot be cast to org.apache.activemq.store.kahadb.data.KahaAddMessageCommand
        at org.apache.activemq.store.kahadb.KahaDBStore.loadMessage(KahaDBStore.java:1248)
        at org.apache.activemq.store.kahadb.KahaDBStore$KahaDBMessageStore$4.execute(KahaDBStore.java:593)
        at org.apache.activemq.store.kahadb.disk.page.Transaction.execute(Transaction.java:779)
        at org.apache.activemq.store.kahadb.KahaDBStore$KahaDBMessageStore.recoverNextMessages(KahaDBStore.java:582)
        at org.apache.activemq.store.ProxyMessageStore.recoverNextMessages(ProxyMessageStore.java:110)
        at org.apache.activemq.broker.region.cursors.QueueStorePrefetch.doFillBatch(QueueStorePrefetch.java:120)
        at org.apache.activemq.broker.region.cursors.AbstractStoreCursor.fillBatch(AbstractStoreCursor.java:420)
        ... 10 more
ERROR | Failed to page in more queue messages 
java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassCastException: org.apache.activemq.store.kahadb.data.KahaTraceCommand cannot be cast to org.apache.activemq.store.kahadb.data.KahaAddMessageCommand
        at org.apache.activemq.broker.region.cursors.AbstractStoreCursor.reset(AbstractStoreCursor.java:166)
        at org.apache.activemq.broker.region.cursors.StoreQueueCursor.reset(StoreQueueCursor.java:169)
        at org.apache.activemq.broker.region.Queue.doPageInForDispatch(Queue.java:1941)
        at org.apache.activemq.broker.region.Queue.pageInMessages(Queue.java:2170)
        at org.apache.activemq.broker.region.Queue.iterate(Queue.java:1607)
        at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
        at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.RuntimeException: java.lang.ClassCastException: org.apache.activemq.store.kahadb.data.KahaTraceCommand cannot be cast to org.apache.activemq.store.kahadb.data.KahaAddMessageCommand
        at org.apache.activemq.broker.region.cursors.AbstractStoreCursor.fillBatch(AbstractStoreCursor.java:423)
        at org.apache.activemq.broker.region.cursors.AbstractStoreCursor.reset(AbstractStoreCursor.java:163)
        ... 9 more
Caused by: java.lang.ClassCastException: org.apache.activemq.store.kahadb.data.KahaTraceCommand cannot be cast to org.apache.activemq.store.kahadb.data.KahaAddMessageCommand
        at org.apache.activemq.store.kahadb.KahaDBStore.loadMessage(KahaDBStore.java:1248)
        at org.apache.activemq.store.kahadb.KahaDBStore$KahaDBMessageStore$4.execute(KahaDBStore.java:593)
        at org.apache.activemq.store.kahadb.disk.page.Transaction.execute(Transaction.java:779)
        at org.apache.activemq.store.kahadb.KahaDBStore$KahaDBMessageStore.recoverNextMessages(KahaDBStore.java:582)
        at org.apache.activemq.store.ProxyMessageStore.recoverNextMessages(ProxyMessageStore.java:110)
        at org.apache.activemq.broker.region.cursors.QueueStorePrefetch.doFillBatch(QueueStorePrefetch.java:120)
        at org.apache.activemq.broker.region.cursors.AbstractStoreCursor.fillBatch(AbstractStoreCursor.java:420)
        ... 10 more
  • 为什么会发生这种情况
  • 我如何从中恢复

  • 在配置或代码中,我可以做些什么来防止这种情况和/或从中恢复?

    您使用的是哪个版本的AMQ?这是一次优雅的关机和重启还是其他什么?@user3788685我使用的是最新版本。我使用
    sudo reboot now
    将其关闭。如果您只是停止/启动/重新启动activemq代理,或者只是在主机重新启动时,会发生这种情况吗?我运行5.14.3时没有任何问题-但我确实在服务器重新启动时遇到了最新的2个版本(主要是在统计方面)@user3788685的问题-但并不总是这样。只有在发送/确认/恢复消息的同时重新启动时才会发生这种情况。这是ActiveMQ的基本持久性问题。如果我改用MySQL作为持久性,这个问题永远不会发生。我没有注意到这个问题——但我总是在重新启动之前优雅地关闭我的aqm实例。我刚刚注意到他们发布了5.15.0,它修复了很多问题,因此可能值得通过changelog/jira或测试部署来查看错误是否得到解决。如果周末有机会,我会尝试用我的测试实例重现这个问题。(但上一个版本给了我其他的问题,主要是监控界面,所以无法在生产中使用)