关于ActiveMQ+Zookeeper做集群时,解决启动报错:java.io.IOException: com/google/common/util/concurrent/internal/InternalFutureFailureAccess
这个问题我也是无意间碰到的,之前一直是使用单机的ActiveMQ,所以也没这个问题,但是做集群时碰到这个问题,问题是这样子出现的:
首先,我准备了三台虚拟机,然后使用 Replicated LevelDB 的方式配置集群,配置如下:
<persistenceAdapter>
<!--<kahaDB directory="${activemq.data}/kahadb"/>-->
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:61619"
zkAddress="192.168.209.133:2181,192.168.209.134:2181,192.168.209.135:2181"
zkPath="/activemq"
hostname="test3"
/>
</persistenceAdapter>
之后使用 ./activemq console 命令将三个虚拟机中的ActiveMQ成功启动。
接着我断开master节点,发现剩下两台slave节点会自动选举一个成为master节点,再把原来的master节点启动,就相当于一个新的slave节点加入了集群。
这样子,我以为集群就是好的了,然后写代码,发布消费,都是很正常的。然后问题就出现了。
我在把master节点关闭,本来期望着剩下的节点能自动选一个成为master节点,可结果发现本该成为master节点的服务抛出了异常,重启都无效,而且此时代码也访问不了,ActiveMQ的管理后台也访问不了,就相当于整个集群挂了!!!
报错大概是这样子的:
java.io.IOException: com/google/common/util/concurrent/internal/InternalFutureFailureAccess
at org.apache.activemq.util.IOExceptionSupport.create(IOExceptionSupport.java:40)
at org.apache.activemq.leveldb.LevelDBClient.might_fail(LevelDBClient.scala:552)
at org.apache.activemq.leveldb.LevelDBClient.replay_init(LevelDBClient.scala:667)
at org.apache.activemq.leveldb.LevelDBClient.start(LevelDBClient.scala:558)
at org.apache.activemq.leveldb.DBManager.start(DBManager.scala:648)
at org.apache.activemq.leveldb.LevelDBStore.doStart(LevelDBStore.scala:312)
at org.apache.activemq.leveldb.replicated.MasterLevelDBStore.doStart(MasterLevelDBStore.scala:110)
at org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:55)
at org.apache.activemq.leveldb.replicated.ElectingLevelDBStore$$anonfun$start_master$1.apply$mcV$sp(ElectingLevelDBStore.scala:230)
at org.fusesource.hawtdispatch.package$$anon$4.run(hawtdispatch.scala:330)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NoClassDefFoundError: com/google/common/util/concurrent/internal/InternalFutureFailureAccess
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.google.common.cache.LocalCache$LoadingValueReference.<init>(LocalCache.java:3472)
at com.google.common.cache.LocalCache$LoadingValueReference.<init>(LocalCache.java:3476)
at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2134)
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2045)
at com.google.common.cache.LocalCache.get(LocalCache.java:3951)
at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3974)
at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4958)
at org.iq80.leveldb.impl.TableCache.getTable(TableCache.java:90)
at org.iq80.leveldb.impl.TableCache.newIterator(TableCache.java:78)
at org.iq80.leveldb.impl.TableCache.newIterator(TableCache.java:73)
at org.iq80.leveldb.impl.DbImpl.buildTable(DbImpl.java:1011)
at org.iq80.leveldb.impl.DbImpl.writeLevel0Table(DbImpl.java:952)
at org.iq80.leveldb.impl.DbImpl.recoverLogFile(DbImpl.java:564)
at org.iq80.leveldb.impl.DbImpl.<init>(DbImpl.java:209)
at org.iq80.leveldb.impl.Iq80DBFactory.open(Iq80DBFactory.java:82)
at org.apache.activemq.leveldb.LevelDBClient$$anonfun$replay_init$2.apply$mcV$sp(LevelDBClient.scala:687)
at org.apache.activemq.leveldb.LevelDBClient$$anonfun$replay_init$2.apply(LevelDBClient.scala:667)
at org.apache.activemq.leveldb.LevelDBClient$$anonfun$replay_init$2.apply(LevelDBClient.scala:667)
at org.apache.activemq.leveldb.LevelDBClient.might_fail(LevelDBClient.scala:549)
... 11 more
Caused by: java.lang.ClassNotFoundException: com.google.common.util.concurrent.internal.InternalFutureFailureAccess
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 63 more
然后花了半个小时的时间百度(Google进不去,可惜了),得到的解决方法主要有四种:
1、移除lib目录中的pax-url-aether-1.5.2.jar包(对我情况无效,lib目录下没有这个包,园友们可以试试)
2、注释或者删除conf/activemq.xml中id="logQuery"的bean,它的class="io.fabric8.insight.log.log4j.Log4jLogQuery"(对我情况无效,园友们可以试试)
3、清除所有的数据,也就是删除每个节点的上面配置的 replicatedLevelDB 节点中 directory 属性指向的目录 ,比如我这里就是删除每个节点下的 data/leveldb 目录(证实有效)
4、换低版本的activemq试试(这个没试)
唯一能解决这个问题的办法是清除所有数据,这让我难以接受,如果哪天线上环境不小心把master节点停了,然道要清除所有数据才能重启?这种情况谁都无法接受。
只能自己想办法了,看异常信息,开头是:
java.io.IOException: com/google/common/util/concurrent/internal/InternalFutureFailureAccess
at org.apache.activemq.util.IOExceptionSupport.create(IOExceptionSupport.java:40)
at org.apache.activemq.leveldb.LevelDBClient.might_fail(LevelDBClient.scala:552)
at org.apache.activemq.leveldb.LevelDBClient.replay_init(LevelDBClient.scala:667)
at org.apache.activemq.leveldb.LevelDBClient.start(LevelDBClient.scala:558)
at org.apache.activemq.leveldb.DBManager.start(DBManager.scala:648)
at org.apache.activemq.leveldb.LevelDBStore.doStart(LevelDBStore.scala:312)
at org.apache.activemq.leveldb.replicated.MasterLevelDBStore.doStart(MasterLevelDBStore.scala:110)
at org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:55)
at org.apache.activemq.leveldb.replicated.ElectingLevelDBStore$$anonfun$start_master$1.apply$mcV$sp(ElectingLevelDBStore.scala:230)
at org.fusesource.hawtdispatch.package$$anon$4.run(hawtdispatch.scala:330)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
....
这个大致信息可以理解为,本节点在作为master节点启动时出错了,在 IOExceptionSupport.create()方法想创建一个对象时抛出异常,异常信息是下面的:
Caused by: java.lang.NoClassDefFoundError: com/google/common/util/concurrent/internal/InternalFutureFailureAccess
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
...
Caused by: java.lang.ClassNotFoundException: com.google.common.util.concurrent.internal.InternalFutureFailureAccess
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 63 more
这个明显是说找不到类:com.google.common.util.concurrent.internal.InternalFutureFailureAccess,那好吧,我给你去找这个类。
于是接着百度,果然度娘最喜欢辜负了苦心人,没有!
这时脑子突然机灵了一下,为什么不去Maven上面找找呢?maven直通车:https://mvnrepository.com/
然后我搜索 com.google.common.util.concurrent.internal.InternalFutureFailureAccess 这个类,果然在上面找到一个包存在这个类:

进去看详情,好家伙,这个包就两个版本,还两三年没更新了,然后我选择1.0.1版本进去,下载jar包:

为避免不熟悉maven的朋友找不到,我将两个版本的jar包都下载再来了,因为担心每个版本依赖不一样,大家可以从百度网盘获取:https://pan.baidu.com/s/1T7sxBYuqqrPnyGWU4VJz9g (提取码: mtaj )
jar下载下来后,我将包放到每个节点ActiveMQ的lib目录下,然后重启每个节点,问题完美解决!!!!
这个问题写这么多,是因为确实度娘上的资料太少了,相信以后还有很多园友会碰到这个问题了,特此记一下!
- - - - - - - - - - - - - - - - - - - 分割线- - - - - - - - - - - - - - - - - - -
另外,还有一个小问题,在使用过程中,发现ActiveMQ启动后,抛出下面的异常:An IOException was thrown (should never happen in this method).
java.lang.RuntimeException: An IOException was thrown (should never happen in this method).
at org.apache.activemq.leveldb.record.CollectionKey$Buffer.bean(CollectionKey.java:264)
at org.apache.activemq.leveldb.record.CollectionKey$Buffer.getKey(CollectionKey.java:284)
at org.apache.activemq.leveldb.LevelDBClient$$anonfun$replay_from$1$$anonfun$apply$mcV$sp$4.apply(LevelDBClient.scala:757)
at org.apache.activemq.leveldb.LevelDBClient$$anonfun$replay_from$1$$anonfun$apply$mcV$sp$4.apply(LevelDBClient.scala:740)
at scala.Option.map(Option.scala:146)
at org.apache.activemq.leveldb.LevelDBClient$$anonfun$replay_from$1.apply$mcV$sp(LevelDBClient.scala:740)
at org.apache.activemq.leveldb.LevelDBClient$$anonfun$replay_from$1.apply(LevelDBClient.scala:707)
at org.apache.activemq.leveldb.LevelDBClient$$anonfun$replay_from$1.apply(LevelDBClient.scala:707)
at org.apache.activemq.leveldb.LevelDBClient.might_fail(LevelDBClient.scala:549)
at org.apache.activemq.leveldb.LevelDBClient.replay_from(LevelDBClient.scala:706)
at org.apache.activemq.leveldb.replicated.SlaveLevelDBStore$$anonfun$send_wal_ack$1.apply$mcV$sp(SlaveLevelDBStore.scala:185)
at org.fusesource.hawtdispatch.package$$anon$4.run(hawtdispatch.scala:330)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.EOFException
at org.fusesource.hawtbuf.proto.CodedInputStream.readRawByte(CodedInputStream.java:346)
at org.fusesource.hawtbuf.proto.CodedInputStream.readRawVarint32(CodedInputStream.java:240)
at org.fusesource.hawtbuf.proto.CodedInputStream.skipField(CodedInputStream.java:117)
at org.apache.activemq.leveldb.record.CollectionKey$Bean.mergeUnframed(CollectionKey.java:172)
at org.apache.activemq.leveldb.record.CollectionKey$Buffer.bean(CollectionKey.java:259)
... 14 more
虽然有这个异常,但是ActiveMQ还是能正常启动正常使用,不过我还是有些担心,所以就查了一下,结果发现后台跑了两个ActiveMQ进程,杀掉再启动还是会再启动两个进程,没办法,只好试试重启一下机器,结果问题解决
关于ActiveMQ+Zookeeper做集群时,解决启动报错:java.io.IOException: com/google/common/util/concurrent/internal/InternalFutureFailureAccess的更多相关文章
- React Natived打包报错java.io.IOException: Could not delete path '...\android\support\v7'解决
问题详情 React Native打包apk时在第二次编译时候报错: java.io.IOException: Could not delete path 'D:\mycode\reactnative ...
- ActiveMq+zookeeper+levelDB集群整合配置
ActiveMq+zookeeper+levelDB集群整合配置 环境:linux系统,jdk1.7 三台linux系统电脑.我这里使用一台window,分别远程3台linux电脑.三台电脑的ip分 ...
- zookeeper做集群后启动不了,大部分原因是防火墙未关闭
zookeeper做单机版,可以正常启动:但是zookeeper做集群后启动不了,大部分原因是防火墙未关闭. centos的关闭防火墙方法比较独立. systemctl stop firewalld. ...
- vue解决启动报错cjs loader.js Error: Cannot find module '../config'问题
vue解决启动报错cjs loader.js Error: Cannot find module '../config'问题 今天下载了一个开源项目一直运行不了,折腾了半天才找到问题所在,config ...
- 解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level
解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level 学习了:https://blog.csdn. ...
- 完美解决JavaIO流报错 java.io.FileNotFoundException: F:\ (系统找不到指定的路径。)
完美解决JavaIO流报错 java.io.FileNotFoundException: F:\ (系统找不到指定的路径.) 错误原因 读出文件的路径需要有被拷贝的文件名,否则无法解析地址 源代码(用 ...
- nutch爬取时Exception in thread “main” java.io.IOException: Job failed!
用cygwin运行nutch 1.2爬取提示IOException: $ bin/nutch crawl urls -dir crawl -depth 3 -topN 10 crawl started ...
- centos6下ActiveMQ+Zookeeper消息中间件集群部署记录
由于最近一个项目并发请求压力比较大,所以考虑改进架构,引入消息中间件集群作为一个缓冲消息队列,具体需求:1)将大量的WebService请求报文发送到mq集群之中,并保持消息先后顺序2)保证每个消息的 ...
- redis cluster 设置密码做集群时gem下client.rb文件修改
redis节点有设置密码,然后在创建集群的时候没有设置密码的命令 ./redis-trib.rb create --replicas 1 127.0.0.1:6381 127.0.0.1:6382 1 ...
随机推荐
- 快速上手git gitlab协同合作
简单记录,整理. 摘要 为方便大家快速上手Git,并使用Gitlab协同合作,特编写此手册,手册内容不会太丰富与深入.主要包含如下内容: Git 使用教程1.1 安装1.2 常用命令1.3 版本控制1 ...
- SpringMVC(4):文件上传与下载
一,文件上传 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理 ...
- 【Linux】【Services】【Configuration】puppet
1. 简介 1.1. 官方网站:https://docs.puppet.com/ 1.2. puppet是IT基础设施自动化管理工具,他的整个生命周期包括:provisioning,configura ...
- apply 和 call 的区别
相同点: 都能够改变方法的执行上下文(执行环境),将一个对象的方法交给另一个对象来执行,并且是立即执行 不同点: call方法从第二个参数开始可以接收任意个参数,每个参数会映射到相应位置的func的参 ...
- 解决在进行socket通信时,一端输出流OutputStream不关闭,另一端输入流就接收不到数据
输出的数据需要达到一定的量才会向另一端输出,所以在传输数据的末端添加 \r\n 可以保证不管数据量是多少,都立刻传输到另一端.
- 【MySQL】排名函数
https://www.cnblogs.com/shizhijie/p/9366247.html 排名函数 主要有rank和dense_rank两种 区别: rank在排名的时候,排名的键一样的时候是 ...
- uniapp实现钉钉扫码登录
由于uniapp暂无钉钉授权登录所以本文将钉钉扫码登录作为网页嵌入uniapp,最终实现钉钉扫码登录app 1. 用H5调起钉钉扫码登录 钉钉在网页端的扫码登录可参考钉钉文档:扫码登录第三方网站 - ...
- 安装MySQL5.7.26教程图解
安装MySQL5.7.26教程图解 1.安装mysql所需的yum源 yum -y install gcc-c++ ncurses-devel cmake make perl gcc autoconf ...
- Sysenter/Kifastcallentry hook 检测与恢复
关于Sysenter.Kifastcallentry.中断之类的内核入口hook技术早就烂大街了,可是对hook的检测与恢复代码却是寥寥无几,一切抛开代码将原理的行为都是耍流氓. 下面以Sysente ...
- C# 使用163的SMTP服务器发送邮件
string Receiver, string Subject, string content: //163邮箱发送配置 client = new System.Net.Mail.SmtpClient ...