rocketMQ 4.5.x + 在jdk8+的环境启动

官方下载的源码或者压缩包在jdk8的环境下没什么问题,按照步骤来就启动了
但是在jdk9 ,10,11的环境下就无法启动了,官方git的issure和百度都能找到相应解决方案
但是大多没说一些特殊情况,而且是非常隐蔽的特殊情况

情况1 升级之前已经使用jdk8启动过mq

这种情况比较普遍吧,按照官方教程,注释、修改了runserver和runbroker还有tools三个文件的启动脚本之后

参数修改可以参考https://www.cnblogs.com/wintersoft/p/10881601.html
在out启动日志里不再报错之后,才到下面的处理步骤

启动server正常,启动broker就失败了,并且在几个日志里几乎找不到任何报错信息(broker的启动日志,还有gc日志里,其他地方没注意,我下的是压缩包,源码启动估计能看到具体信息)此时需要删除MQ在用户目录下生成的store文件夹里的内容,然后再启动,这一点上,就加大了生产环境升级的难度,所以生产环境使用了rocketmq最好不要更换jdk,如果必要,记得把消费、生产、topic这些数据备份下来考虑怎么还原的问题,而且能不能还原并没证实过(主要是还没被消费过的消息)

情况2 关闭broker抛出了InaccessibleObjectException异常

在运行了mqshutdown broker之后抛InaccessibleObjectException异常,Unable to make public void jdk.internal.ref.Cleaner.clean() accessible,

这个主要是jdk9+模块化编程的新特性引起的,看到一个大佬的解决方案后完美解决

https://blog.csdn.net/zhxdick/article/details/90514045

在runbroker的启动脚本里添加一句启动参数就行了

JAVA_OPT="${JAVA_OPT} --add-exports java.base/jdk.internal.ref=ALL-UNNAMED"

最后再提一句,broker被异常中断之后,很有可能导致后面broker无法再启动,必须要删除store文件夹的问题,主要是服务器断电这种情况,云服务器一般不太会有这种情况,主要是我本地测试的时候发现的,windows系统,电脑一旦断电闪了,等来电开机broker就废了,linux没试过拔插头,不过感觉应该也存在这个问题,而删store文件夹,意味着整个执行中的业务,全部报废,这个问题一旦发生在生产环境特别灾难,所以抽空还是研究下怎么还原未被消费的消息好了。

附上三个启动文件更改后的脚本,windows脚本差不多

runserver.sh

#!/bin/sh# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.#===========================================================================================
# Java Environment Setting
#===========================================================================================
error_exit ()
{echo "ERROR: $1 !!"exit 1
}[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"#export JAVA_HOME="/usr/lib/jvm/java-8-openjdk"
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
#export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
export CLASSPATH=${BASE_DIR}/lib/rocketmq-namesrv-4.8.0.jar:${BASE_DIR}/lib/*:${BASE_DIR}/conf:${CLASSPATH}:${CLASS_PATH}
#===========================================================================================
# JVM Configuration
#===========================================================================================
# The RAMDisk initializing size in MB on Darwin OS for gc-log
DIR_SIZE_IN_MB=600choose_gc_log_directory()
{case "`uname`" inDarwin)if [ ! -d "/Volumes/RAMDisk" ]; then# create ram disk on Darwin systems as gc-log directoryDEV=`hdiutil attach -nomount ram://$((2 * 1024 * DIR_SIZE_IN_MB))` > /dev/nulldiskutil eraseVolume HFS+ RAMDisk ${DEV} > /dev/nullecho "Create RAMDisk /Volumes/RAMDisk for gc logging on Darwin OS."fiGC_LOG_DIR="/Volumes/RAMDisk";;*)# check if /dev/shm exists on other systemsif [ -d "/dev/shm" ]; thenGC_LOG_DIR="/dev/shm"elseGC_LOG_DIR=${BASE_DIR}fi;;esac
}choose_gc_options()
{# Example of JAVA_MAJOR_VERSION value : '1', '9', '10', '11', ...# '1' means releases befor Java 9JAVA_MAJOR_VERSION=$("$JAVA" -version 2>&1 | sed -E -n 's/.* version "([0-9]*).*$/\1/p')if [[ "$JAVA_MAJOR_VERSION" -lt "9" ]] ; thenJAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC"JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log -XX:+PrintGCDetails"JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"elseJAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0"JAVA_OPT="${JAVA_OPT} -Xlog:gc*:file=${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log:time,tags:filecount=5,filesize=30M"fi
}choose_gc_log_directoryJAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx512m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
choose_gc_options
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
#JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib:${JAVA_HOME}/lib/ext"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"$JAVA ${JAVA_OPT} $@

runbroker.sh

#!/bin/sh# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.#===========================================================================================
# Java Environment Setting
#===========================================================================================
error_exit ()
{echo "ERROR: $1 !!"exit 1
}#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
#[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"export JAVA_HOME="/usr/lib/jvm/java-11-openjdk"
#export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
#export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
export CLASSPATH=${BASE_DIR}/lib/rocketmq-broker-4.8.0.jar:${BASE_DIR}/lib/*:${BASE_DIR}/conf:${CLASSPATH}
#===========================================================================================
# JVM Configuration
#===========================================================================================
# The RAMDisk initializing size in MB on Darwin OS for gc-log
DIR_SIZE_IN_MB=600choose_gc_log_directory()
{case "`uname`" inDarwin)if [ ! -d "/Volumes/RAMDisk" ]; then# create ram disk on Darwin systems as gc-log directoryDEV=`hdiutil attach -nomount ram://$((2 * 1024 * DIR_SIZE_IN_MB))` > /dev/nulldiskutil eraseVolume HFS+ RAMDisk ${DEV} > /dev/nullecho "Create RAMDisk /Volumes/RAMDisk for gc logging on Darwin OS."fiGC_LOG_DIR="/Volumes/RAMDisk";;*)# check if /dev/shm exists on other systemsif [ -d "/dev/shm" ]; thenGC_LOG_DIR="/dev/shm"elseGC_LOG_DIR=${BASE_DIR}fi;;esac
}choose_gc_log_directoryJAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx512m -Xmn128m"
JAVA_OPT="${JAVA_OPT} --add-exports java.base/jdk.internal.ref=ALL-UNNAMED"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0"
#JAVA_OPT="{JAVA_OPT} -verbose:gc -Xloggc:{GC_LOG_DIR}/rmq_broker_gc_%p_%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
JAVA_OPT="${JAVA_OPT} -Xlog:gc*:file=${GC_LOG_DIR}/rmq_broker_gc_%p_%t.log:time,tags:filecount=5,filesize=30M"
#JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"
#JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=15g"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"
#JAVA_OPT="{JAVA_OPT} -Djava.ext.dirs={JAVA_HOME}/jre/lib/ext:{BASE_DIR}/lib:BASE
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"numactl --interleave=all pwd > /dev/null 2>&1
if [ $? -eq 0 ]
thenif [ -z "$RMQ_NUMA_NODE" ] ; thennumactl --interleave=all $JAVA ${JAVA_OPT} $@elsenumactl --cpunodebind=$RMQ_NUMA_NODE --membind=$RMQ_NUMA_NODE $JAVA ${JAVA_OPT} $@fi
else$JAVA ${JAVA_OPT} $@
fi

tools.sh

#!/bin/sh# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.#===========================================================================================
# Java Environment Setting
#===========================================================================================
error_exit ()
{echo "ERROR: $1 !!"exit 1
}[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"#export JAVA_HOME="/usr/lib/jvm/java-11-openjdk"
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
#export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
export CLASSPATH=${BASE_DIR}/lib/rocketmq-tools-4.8.0.jar:${BASE_DIR}/lib/*:${BASE_DIR}/conf:${CLASSPATH}:${CLASS_PATH}#===========================================================================================
# JVM Configuration
#===========================================================================================
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"
#JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib:${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"$JAVA ${JAVA_OPT} "$@"

我这使用的是4.8.0的,4.8.0的官方在server和broker里内置了jdk>8的判断附加的启动参数,如果是4.7.0或者4.5.0的版本把if else里的那两个启动参数复制到下面的JAVA_OPT里就行了
最主要的还是注释源于的JAVA_OPT的几个参数,还有CLASSPATH的指向,CLASSPATH不改启动会一直报找不到主启动类的错

jdk9 jdk10 jdk11启动rocketMQ的问题相关推荐

  1. jdk9与jdk11哪个好_JDK 9、10和11中的安全性增强

    jdk9与jdk11哪个好 缩短JDK发布周期的原因之一是有可能推出更快的安全错误修复和增强功能. 在本文中,我们将简要回顾一下最新JDK版本中引入的主要安全增强功能. 由于这些增强功能中的大多数与T ...

  2. 启动RocketMQ报错:Please set the JAVA_HOME variable in your environment, We need java 64

    原文链接 在启动RocketMQ时出现以下错误解决方案 错误信息:Please set the JAVA_HOME variable in your environment, We need java ...

  3. 启动rocketmq 报错_RocketMQ为什么要保证订阅关系的一致性?

    前段时间有个朋友向我提了一个问题,他说在搭建 RocketMQ 集群过程中遇到了关于消费订阅的问题,具体问题如下: 然后他发了报错的日志给我看: the consumer's subscription ...

  4. Ubuntu18.04中同时安装JDK8、JDK9和JDK11

    1. 什么是JDK: JDK是Java Development Kit,Java开发工具.它是用Java语言来写应用程序和开发工具的开发工具.在利用Java语言进行开发的时候需要JDK ,在测试用Ja ...

  5. 在macOS中同时安装jdk8、jdk9、jdk11、jdk12并自由切换

    在macOS中同时安装jdk8.9.11.12并自由切换 在macOS中安装jdk,并查看是否安装成功 打开根目录下的隐藏文件.bash_profile进行环境配置 执行source命令生效 使用jd ...

  6. Windows下启动rocketMq

    提示:本文章环境:rocketmq5.0.0.windows10.java8(请提前安装并配置好java环境) 文章目录 一.rocketMQ下载 二.配置rocketmq 1.新增环境变量 2.修改 ...

  7. windows下安装启动rocketmq可视化界面

    1.下载可视化插件源码 github下载地址:https://github.com/apache/rocketmq-dashboard 旧版本源码是在rocketmq-external里的rocket ...

  8. 记录排查rocketMQ-broker-JVM进程消失问题

    问题描述: rocketmq集群两个节点上的broker jvm进程突然每天整点不定时丢失 原因分析: day1 进程丢失问题通常有两种原因: 1.系统物理内存耗尽(观察当时的内存使用情况.IO.CP ...

  9. 聊聊Java8之后的JDK升级内容(看这一篇就够了)

    聊聊Java8之后的JDK升级内容(看这一篇就够了) 背景 从 JDK 8 到 JDK 17 的新特性 JDK8 回顾 JDK9 JDK10 JDK11 JDK12 JDK13 JDK14 JDK15 ...

最新文章

  1. javaScript 的小技巧
  2. Python Module_openpyxl_处理Excel表格
  3. 信息系统项目管理师-常用术语中英文对应
  4. 设置Collection 或 Map 只读
  5. VB自定义函数加 和 ;
  6. 百度地图得到两地点(通过经纬度)的距离、 通过经纬度获取详细地址
  7. Failed to execute goal maven-gpg-plugin 1.5 Sign
  8. 若川知乎问答:做前端感觉很吃力怎么办?
  9. html之特殊字符表
  10. 4.Unix工作环境
  11. sap固定资产号码范围_SAP--FI详细解---固定资产
  12. 微信小程序 display: flex 与inline-flex的区别以及应用
  13. 2007年中国网络游戏市场分析及投资咨询报告(上下卷)
  14. 模仿 Github设计一个博客网站的 API
  15. 设置vscode默认终端为msys/MinGW32/MinGW64
  16. 无人驾驶汽车系统入门(二)——高级运动模型和扩展卡尔曼滤波
  17. HDMI 1.4和HDMI 2.0区别
  18. Qt中QOpengl的QMatrix4x4矩阵作用原理以及使用方法
  19. 阿里云ACP云计算错题集71-100
  20. jstree的简单使用例子

热门文章

  1. 【UVM基础】CallBack机制快速上手指南
  2. java中特殊符号怎么校验_校验中文、空格和特殊符号的方法
  3. Java初学01:学习路线,springcloud视频下载
  4. 3D城市模型、实景城市图...航测无人机轻松构建另一个世界
  5. vue前端怎么下载后端返回的二进制流excel表格文件
  6. 读书:找到锚点,然后把自己给钉死
  7. wince 之临时宏控制 bib 和 reg
  8. Bootstrap - 前端框架
  9. ie css 图片边框颜色,CSS-在Chrome / IE9中删除图片边框
  10. Windows 10发布日期提速,将于7月29日上市