今天下午发现公司的activemq消息系统异常,在某个topics上堆积了大量消息,后来发现是有开发同学直接在生产环境上测试,以durable subscription方式订阅消息,应为是测试, 消费不及时, 导致大量消息堆积。
停止activemq后重新启动, 发现服务总是起不来, 查看日志文件有如下异常
- 2011-09-16 16:39:03,220 | INFO | Using Persistence Adapter: KahaDBPersistenceAdapter[/mnt/gfs2/mq-as-2/kahadb1] | org.apache.activemq.broker.BrokerService | WrapperSimpleAppMain
- 2011-09-16 16:39:03,824 | INFO | KahaDB is version 2 | org.apache.activemq.store.kahadb.MessageDatabase | WrapperSimpleAppMain
- 2011-09-16 16:39:03,841 | INFO | Recovering from the journal ... | org.apache.activemq.store.kahadb.MessageDatabase | WrapperSimpleAppMain
- 2011-09-16 16:39:03,841 | INFO | Recovery replayed 1 operations from the journal in 0.012 seconds. | org.apache.activemq.store.kahadb.MessageDatabase | WrapperSimpleAppMain
- 2011-09-16 16:39:03,849 | INFO | ActiveMQ 5.4.1 JMS Message Broker (mq-asc) is starting | org.apache.activemq.broker.BrokerService | WrapperSimpleAppMain
- 2011-09-16 16:39:03,849 | INFO | For help or more information please see: http://activemq.apache.org/ | org.apache.activemq.broker.BrokerService | WrapperSimpleAppMain
- 2011-09-16 16:39:03,986 | INFO | Scheduler using directory: activemq-data/mq-asc/scheduler | org.apache.activemq.broker.scheduler.SchedulerBroker | WrapperSimpleAppMain
- 2011-09-16 16:39:04,066 | ERROR | Failed to start ActiveMQ JMS Message Broker. Reason: java.io.EOFException: Chunk stream does not exist at page: 0 | org.apache.activemq.broker.BrokerService | WrapperSimpleAppMain
- java.io.EOFException: Chunk stream does not exist at page: 0
- at org.apache.kahadb.page.Transaction$2.readPage(Transaction.java:454)
- at org.apache.kahadb.page.Transaction$2.<init>(Transaction.java:431)
- at org.apache.kahadb.page.Transaction.openInputStream(Transaction.java:428)
- at org.apache.kahadb.page.Transaction.load(Transaction.java:404)
- at org.apache.kahadb.page.Transaction.load(Transaction.java:361)
- at org.apache.activemq.broker.scheduler.JobSchedulerStore$3.execute(JobSchedulerStore.java:250)
- at org.apache.kahadb.page.Transaction.execute(Transaction.java:728)
- at org.apache.activemq.broker.scheduler.JobSchedulerStore.doStart(JobSchedulerStore.java:239)
- at org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:53)
- at org.apache.activemq.broker.scheduler.SchedulerBroker.getStore(SchedulerBroker.java:198)
- at org.apache.activemq.broker.scheduler.SchedulerBroker.getInternalScheduler(SchedulerBroker.java:185)
- at org.apache.activemq.broker.scheduler.SchedulerBroker.start(SchedulerBroker.java:85)
- at org.apache.activemq.broker.BrokerFilter.start(BrokerFilter.java:157)
- at org.apache.activemq.broker.BrokerFilter.start(BrokerFilter.java:157)
- at org.apache.activemq.broker.TransactionBroker.start(TransactionBroker.java:112)
- at org.apache.activemq.broker.BrokerFilter.start(BrokerFilter.java:157)
- at org.apache.activemq.broker.BrokerFilter.start(BrokerFilter.java:157)
- at org.apache.activemq.broker.BrokerService$3.start(BrokerService.java:1786)
- at org.apache.activemq.broker.BrokerService.start(BrokerService.java:496)
- at org.apache.activemq.xbean.XBeanBrokerService.afterPropertiesSet(XBeanBrokerService.java:60)
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
- at java.lang.reflect.Method.invoke(Method.java:597)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1536)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1409)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
- at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
- at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
- at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
- at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
- at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:574)
- at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
- at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
网上找了一把, 发现是由于 5.4.1 这个版本引入了 延迟发送的功能引起的, 解决方式也很简单,在<broker>中添加 schedulerSupport="false" 属性,禁掉scheduler功能就可以了。
转载于:https://blog.51cto.com/yaoyinjie/666582