服务器重新启动后JMS队列损坏,抛出java.lang.ClassCastException
我正在Tomcat中使用嵌入式JMS(ActiveMQ)。服务器关闭并重新启动时,现在显示错误:服务器重新启动后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
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或测试部署来查看错误是否得到解决。如果周末有机会,我会尝试用我的测试实例重现这个问题。(但上一个版本给了我其他的问题,主要是监控界面,所以无法在生产中使用)