2021-01-05

博客园Logo
首页
新闻
博问
专区
闪存
班级

代码改变世界
搜索
注册
登录
返回主页
freephp
博客园
首页
新随笔
联系
订阅
管理
RocetMQ搭建攻略和问题解决之道

最近有在尝试给项目加入消息中间件服务,首先想到了鼎鼎大名的RocketMQ。RocketMQ是一款高性能的、分布式消息中间件,由阿里开源。它提供了丰富的消息拉取方式,能够处理上亿级的海量数据,甚至在阿里双十上经受了超大的请求峰值,其商业可用性值得依赖和使用。

安装方式比较简单,就是在Rocket官网去下载对应版本的压缩包。有两种选择,一种是binary版本,也就是编译好的bin文件压缩包。还有一种是source版,就是需要被编译的源码包。

我选择使用编译好的bin包,版本为最新的4.8.0。使用如下命令完成下载和解压。顺带提一句本机安装的Java版本是10.0.1,划重点。

cd ~/Downloads
weget https://mirrors.bfsu.edu.cn/apache/rocketmq/4.8.0/rocketmq-all-4.8.0-bin-release.zip
unzip rocketmq-all-4.8.0-bin-release.zip
mv rocketmq-all-4.8.0-bin-release rocketmq
然后需要启动NameServer和Broker Server,首先是NameServer,命令如下所示:

cd ~/Downloads/rocketmq/bin
./mqnamesrv
然后很有可能会遇到如下的报错:

-Djava.ext.dirs=/Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home/jre/lib/ext:/Users/tony/Downloads/rocketmq-all-4.8.0-source-release/distribution/bin/…/lib:/Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home/lib/ext is not supported. Use -classpath instead.
Error: Could not create the Java Virtual Machine.
我根据这段报错一番艰难地百度\bing\Google之后,发现没有人遇到完全类似的问题,唯一接近的是Could not create the java Virtual Machine的报错,我尝试性进行了如下方法。
首先怀疑是因为我的Java版本太高了,导致有一些runserver.sh里面的参数设置不能兼容,因为namesrv会执行runserver.sh里面的命令。按照腾讯云上的原话是:
由于RocketMQ的启动文件都是按照JDK8配置的,而前面我特意配置的JDK版本是11,有很多命令参数不支持导致的,使用JDK8,正常启动没有问题的。
于是编辑bin/runserver.sh文件,将下面的命令注释掉:

注释掉下面这行

#export CLASSPATH=.: B A S E D I R / c o n f : {BASE_DIR}/conf: BASEDIR/conf:{CLASSPATH}

修改成下面这行

export CLASSPATH=.: B A S E D I R / l i b / ∗ : {BASE_DIR}/lib/*: BASEDIR/lib/:{BASE_DIR}/conf:${CLASSPATH}
然后还需要将JAVA_OPT的参数注释一部分,它们的位置是在文件内容最后,如下所示:

注释下面这两行

#JAVA_OPT=" J A V A O P T − D j a v a . e x t . d i r s = {JAVA_OPT} -Djava.ext.dirs= JAVAOPTDjava.ext.dirs={JAVA_HOME}/jre/lib/ext: B A S E D I R / l i b : {BASE_DIR}/lib: BASEDIR/lib:{JAVA_HOME}/lib/ext"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
是不是看起来很眼熟?这就是前面我们遇到的报错那段,据说是Java1.9之后使用-Djava.ext.dirs会有问题,我去RocketMQ的github上的issue讨论看了一下,貌似官方团队也没有fix这个问题,2333。
保存好这些修改,然后重新运行mqnamesrv即可,以后台程序方式运行的命令如下:

nohup sh mqnamesrv &
查看运行的日志的命令和其输出如下:

tail -f ~/logs/rocketmqlogs/namesrv.log
2020-12-31 16:15:30 INFO main - tls.client.authServer = false
2020-12-31 16:15:30 INFO main - tls.client.trustCertPath = null
2020-12-31 16:15:30 INFO main - Using OpenSSL provider
2020-12-31 16:15:30 INFO main - SSLContext created for server
2020-12-31 16:15:30 INFO NettyEventExecutor - NettyEventExecutor service started
2020-12-31 16:15:30 INFO main - Try to start service thread:FileWatchService started:false lastThread:null
2020-12-31 16:15:30 INFO FileWatchService - FileWatchService service started
2020-12-31 16:15:30 INFO main - The Name Server boot success. serializeType=JSON
2020-12-31 16:16:30 INFO NSScheduledThread1 - --------------------------------------------------------
2020-12-31 16:16:30 INFO NSScheduledThread1 - configTable SIZE: 0
说明NameServer已经正常启动了。
第二步运行Broker Server,还是在bin目录下执行:
./mqbroker
继续收获报错,错误日志输出如下所示:

[0.002s][warning][gc] -Xloggc is deprecated. Will use -Xlog:gc:/Volumes/RAMDisk/rmq_broker_gc_%p_%t.log instead.
Unrecognized VM option ‘PrintGCDateStamps’
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
其本质还是无法创建Java虚拟机,推测还是出在GC的一些参数在Java10.0上无法兼容。查看mqbroker脚本里面的内容,可以看到最后一行执行了如下命令:

sh ${ROCKETMQ_HOME}/bin/runbroker.sh org.apache.rocketmq.broker.BrokerStartup $@
说明执行了runbroker.sh脚本,于是在runbroker.sh文件中找到如下命令:

注释掉下面这行

#export CLASSPATH=.: B A S E D I R / c o n f : {BASE_DIR}/conf: BASEDIR/conf:{CLASSPATH}

修改成下面这行

export CLASSPATH=.: B A S E D I R / l i b / ∗ : {BASE_DIR}/lib/*: BASEDIR/lib/:{BASE_DIR}/conf:${CLASSPATH}
这段修改和mqnamesrv的类似,还有下面这段也需要调整:

JAVA_OPT=" J A V A O P T − s e r v e r − X m s 8 g − X m x 8 g − X m n 4 g " J A V A O P T = " {JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g" JAVA_OPT=" JAVAOPTserverXms8gXmx8gXmn4g"JAVAOPT="{JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0"
JAVA_OPT=" J A V A O P T − v e r b o s e : g c − X l o g g c : {JAVA_OPT} -verbose:gc -Xloggc: JAVAOPTverbose:gcXloggc:{GC_LOG_DIR}/rmq_broker_gc_%p_%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
JAVA_OPT=" J A V A O P T − X X : + U s e G C L o g F i l e R o t a t i o n − X X : N u m b e r O f G C L o g F i l e s = 5 − X X : G C L o g F i l e S i z e = 30 m " J A V A O P T = " {JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m" JAVA_OPT=" JAVAOPTXX:+UseGCLogFileRotationXX:NumberOfGCLogFiles=5XX:GCLogFileSize=30m"JAVAOPT="{JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT=" J A V A O P T − X X : + A l w a y s P r e T o u c h " J A V A O P T = " {JAVA_OPT} -XX:+AlwaysPreTouch" JAVA_OPT=" JAVAOPTXX:+AlwaysPreTouch"JAVAOPT="{JAVA_OPT} -XX:MaxDirectMemorySize=15g"
JAVA_OPT=" J A V A O P T − X X : − U s e L a r g e P a g e s − X X : − U s e B i a s e d L o c k i n g " J A V A O P T = " {JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking" JAVA_OPT=" JAVAOPTXX:UseLargePagesXX:UseBiasedLocking"JAVAOPT="{JAVA_OPT} -Djava.ext.dirs= J A V A H O M E / j r e / l i b / e x t : {JAVA_HOME}/jre/lib/ext: JAVAHOME/jre/lib/ext:{BASE_DIR}/lib:KaTeX parse error: Expected 'EOF', got '#' at position 22: …HOME}/lib/ext" #̲JAVA_OPT="{JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
注释掉一些无效的命令,改后如下所示:

JAVA_OPT="KaTeX parse error: Expected 'EOF', got '#' at position 42: …-Xmx8g -Xmn4g" #̲JAVA_OPT="{JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0"
#JAVA_OPT=" J A V A O P T − v e r b o s e : g c − X l o g g c : {JAVA_OPT} -verbose:gc -Xloggc: JAVAOPTverbose:gcXloggc:{GC_LOG_DIR}/rmq_broker_gc_%p_%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
#JAVA_OPT=" J A V A O P T − X X : + U s e G C L o g F i l e R o t a t i o n − X X : N u m b e r O f G C L o g F i l e s = 5 − X X : G C L o g F i l e S i z e = 30 m " J A V A O P T = " {JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m" JAVA_OPT=" JAVAOPTXX:+UseGCLogFileRotationXX:NumberOfGCLogFiles=5XX:GCLogFileSize=30m"JAVAOPT="{JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="KaTeX parse error: Expected 'EOF', got '#' at position 33: …lwaysPreTouch" #̲JAVA_OPT="{JAVA_OPT} -XX:MaxDirectMemorySize=15g"
JAVA_OPT=" J A V A O P T − X X : − U s e L a r g e P a g e s − X X : − U s e B i a s e d L o c k i n g " J A V A O P T = " {JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking" JAVA_OPT=" JAVAOPTXX:UseLargePagesXX:UseBiasedLocking"JAVAOPT="{JAVA_OPT} #
-Djava.ext.dirs= J A V A H O M E / j r e / l i b / e x t : {JAVA_HOME}/jre/lib/ext: JAVAHOME/jre/lib/ext:{BASE_DIR}/lib:KaTeX parse error: Expected 'EOF', got '#' at position 22: …HOME}/lib/ext" #̲JAVA_OPT="{JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
保存上述修改,然后就可以正常启动Broker Server了,执行下面命令:

nohup sh bin/mqbroker -n localhost:9876 &
如果想最简单的方式测试一下服务,那么可以使用RocketMQ脚本封装好的工具,命令如下:

export NAMESRV_ADDR=localhost:9876
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
可能遇到的报错如下:

sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
-Djava.ext.dirs=bin/…/lib:/Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home/jre/lib/ext:/Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home/lib/ext is not supported. Use -classpath instead.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
还是在tools.sh做类似的修改,如下所示:

注释下面这行

#export CLASSPATH=.: B A S E D I R / c o n f : {BASE_DIR}/conf: BASEDIR/conf:{CLASSPATH}

新增下面这行

export CLASSPATH=.: B A S E D I R / l i b / ∗ : {BASE_DIR}/lib/*: BASEDIR/lib/:{BASE_DIR}/conf:${CLASSPATH}

JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"

注释掉下面这行,JDK1.9后不再支持该参数

#JAVA_OPT=" J A V A O P T − D j a v a . e x t . d i r s = {JAVA_OPT} -Djava.ext.dirs= JAVAOPTDjava.ext.dirs={BASE_DIR}/lib: J A V A H O M E / j r e / l i b / e x t : {JAVA_HOME}/jre/lib/ext: JAVAHOME/jre/lib/ext:{JAVA_HOME}/lib/ext"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"

重新保存后运行,如果看到如下输出则说明成功了:

st, brokerName=Tony-Mac-Pro.local, queueId=3], queueOffset=247]
SendResult [sendStatus=SEND_OK, msgId=7F000001203D1DE0ACA60ED7764803E0, offsetMsgId=AC101A0000002A9F0000000000031232, messageQueue=MessageQueue [topic=TopicTest, brokerName=Tony-Mac-Pro.local, queueId=0], queueOffset=248]
SendResult [sendStatus=SEND_OK, msgId=7F000001203D1DE0ACA60ED7764A03E1, offsetMsgId=AC101A0000002A9F00000000000312FD, messageQueue=MessageQueue [topic=TopicTest, brokerName=Tony-Mac-Pro.local, queueId=1], queueOffset=248]
SendResult [sendStatus=SEND_OK, msgId=7F000001203D1DE0ACA60ED7764C03E2, offsetMsgId=AC101A0000002A9F00000000000313C8, messageQueue=MessageQueue [topic=TopicTest, brokerName=Tony-Mac-Pro.local, queueId=2], queueOffset=248]
SendResult [sendStatus=SEND_OK, msgId=7F000001203D1DE0ACA60ED7764E03E3, offsetMsgId=AC101A0000002A9F0000000000031493, messageQueue=MessageQueue [topic=TopicTest, brokerName=Tony-Mac-Pro.local, queueId=3], queueOffset=248]
SendResult [sendStatus=SEND_OK, msgId=7F000001203D1DE0ACA60ED7764F03E4, offsetMsgId=AC101A0000002A9F000000000003155E, messageQueue=MessageQueue [topic=TopicTest, brokerName=Tony-Mac-Pro.local, queueId=0], queueOffset=249]
SendResult [sendStatus=SEND_OK, msgId=7F000001203D1DE0ACA60ED7764F03E5, offsetMsgId=AC101A0000002A9F0000000000031629, messageQueue=MessageQueue [topic=TopicTest, brokerName=Tony-Mac-Pro.local, queueId=1], queueOffset=249]
SendResult [sendStatus=SEND_OK, msgId=7F000001203D1DE0ACA60ED7765003E6, offsetMsgId=AC101A0000002A9F00000000000316F4, messageQueue=MessageQueue [topic=TopicTest, brokerName=Tony-Mac-Pro.local, queueId=2], queueOffset=249]
SendResult [sendStatus=SEND_OK, msgId=7F000001203D1DE0ACA60ED7765103E7, offsetMsgId=AC101A0000002A9F00000000000317BF, messageQueue=MessageQueue [topic=TopicTest, brokerName=Tony-Mac-Pro.local, queueId=3], queueOffset=249]
21:10:01.562 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[172.16.26.0:10911] result: true
21:10:01.564 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[127.0.0.1:9876] result: true
最终,我们和RocketMQ和解,完成了这次测试!

鸣谢下面的帮助,可以参考的资料如:
腾讯云上的教程
官方quick start

标签: Could not create the Java Virtual Machine, RocketMQ, java
好文要顶 关注我 收藏该文
freephp
关注 - 11
粉丝 - 32
+加关注
0 0
« 上一篇: 编程方式实现MySQL批量导入sql文件
posted @ 2021-01-03 21:47 freephp 阅读(49) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
登录后才能发表评论,立即 登录 或 注册, 访问 网站首页
【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】有你助力,更好为你——博客园用户消费观调查,附带小惊喜!
【推荐】AWS携手博客园为开发者送福利,注册立享12个月免费套餐
【推荐】七牛云新老用户同享 1 分钱抢 CDN 1TB流量大礼包!
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
【推荐】新一代 NoSQL 数据库,Aerospike专区新鲜入驻
最新 IT 新闻:
· Google Chrome浏览器地址栏即将变得更安全、更快速
· 百度地图推出“疫情小区”搜索功能
· 我国量子存储器取得重大进展!世界首次实现“按需读取”
· 2021「蛋壳」要彻底碎了?CFO 等高管相继离职,上市不满一年深陷暴雷风波
· 依图CTO颜水成被曝离职,已加入东南亚电商独角兽Shopee
» 更多新闻…
公告
Flag Counter
昵称: freephp
园龄: 5年5个月
粉丝: 32
关注: 11
+加关注
< 2021年1月 >
日 一 二 三 四 五 六
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6
搜索

找找看

谷歌搜索
我的标签
php(5)
java(3)
spring boot(3)
springboot druid(2)
debug(2)
laravel(2)
curl php(2)
mysql(2)
mysqlnd(1)
openvpn(1)
更多
随笔档案
2021年1月(1)
2020年12月(4)
2020年11月(1)
2020年10月(3)
2020年9月(4)
2020年8月(2)
2020年7月(5)
2020年6月(1)
2020年4月(1)
2020年3月(2)
2020年1月(2)
2019年12月(5)
2019年11月(2)
2019年10月(2)
2019年9月(1)
更多
最新评论

  1. Re:MacOS下解决宿主机和docker容器之间网络互通
    @xuanbg Mac确实有点蛋疼,不过一劳永逸还是可以的…
    –freephp
  2. Re:MacOS下解决宿主机和docker容器之间网络互通
    换成虚拟机跑docker就不用折腾这些破事了……
    –xuanbg
  3. Re:php file_get_contents遇到https的处理办法
    我删除了两个无效的回复,因为会误导别人。我相信大多数看这篇文章的人都是遇到了相关问题,如果你按照我的写法还遇到问题,你完全可以贴出你的报错信息或者截图,如果想探讨我是欢迎的。 你来反问我能用吗? 你试…
    –freephp
  4. Re:1024:写给还活着的研发工程师们
    一起活下去
    –P8大神
  5. Re:1024:写给还活着的研发工程师们
    一起活下去
    –编程猫咪
    阅读排行榜
  6. ubuntu16.04无法设置选择wifi的解决办法(29206)
  7. vue项目引入bootstrap正确姿势(19361)
  8. 给你的git仓库瘦身(13672)
  9. php的curl封装类(8592)
  10. SpringBoot整合Druid(4765)
    评论排行榜
  11. 求生欲很强的数据库(7)
  12. 从一个下载优化说起(4)
  13. 1024:写给还活着的研发工程师们(3)
  14. 给你的git仓库瘦身(3)
  15. 代码简洁之四 统一抽象层次(3)
    推荐排行榜
  16. 求生欲很强的数据库(11)
  17. 如何较快熟悉一个项目?(3)
  18. 1024:写给还活着的研发工程师们(2)
  19. Postman发送POST请求到Spring Boot的正确姿势(2)
  20. SpringBoot整合Druid(2)
    Copyright © 2021 freephp
    Powered by .NET 5.0 on Kubernetes
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值