RocketMQ-Client异常但无报错日志

怀疑Producer Or Consuemr异常,但系统没报错日志

client的日志目前rocketmq默认存放于

${user.home}/logs/rocketmqlogs/rocketmq_client.log

可以查看该日志是否有异常日志打印

public class ClientLogger
    
private static synchronized Appender createClientAppender() {
        String clientLogRoot = System.getProperty(CLIENT_LOG_ROOT, System.getProperty("user.home") + "/logs/rocketmqlogs");
        String clientLogMaxIndex = System.getProperty(CLIENT_LOG_MAXINDEX, "10");
        String clientLogFileName = System.getProperty(CLIENT_LOG_FILENAME, "rocketmq_client.log");
        String maxFileSize = System.getProperty(CLIENT_LOG_FILESIZE, "1073741824");
        String asyncQueueSize = System.getProperty(CLIENT_LOG_ASYNC_QUEUESIZE, "1024");

        String logFileName = clientLogRoot + "/" + clientLogFileName;

        int maxFileIndex = Integer.parseInt(clientLogMaxIndex);
        int queueSize = Integer.parseInt(asyncQueueSize);

        Layout layout = LoggingBuilder.newLayoutBuilder().withDefaultLayout().build();

        Appender rocketmqClientAppender = LoggingBuilder.newAppenderBuilder()
            .withRollingFileAppender(logFileName, maxFileSize, maxFileIndex)
            .withAsync(false, queueSize).withName(ROCKETMQ_CLIENT_APPENDER_NAME).withLayout(layout).build();

        Logger.getRootLogger().addAppender(rocketmqClientAppender);
        return rocketmqClientAppender;
    }
分析报错信息并解决问题: I:\Java\JDK\jdk-17\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\lib\idea_rt.jar=63569:C:\Program Files\JetBrains\IntelliJ IDEA 2024.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\Why\Desktop\day01\day01\代码\day01\day01\rocketmq\target\classes;I:\repository\org\apache\rocketmq\rocketmq-client\4.5.2\rocketmq-client-4.5.2.jar;I:\repository\org\apache\rocketmq\rocketmq-common\4.5.2\rocketmq-common-4.5.2.jar;I:\repository\org\apache\rocketmq\rocketmq-remoting\4.5.2\rocketmq-remoting-4.5.2.jar;I:\repository\com\alibaba\fastjson\1.2.51\fastjson-1.2.51.jar;I:\repository\io\netty\netty-all\4.0.42.Final\netty-all-4.0.42.Final.jar;I:\repository\org\apache\rocketmq\rocketmq-logging\4.5.2\rocketmq-logging-4.5.2.jar;I:\repository\io\netty\netty-tcnative-boringssl-static\1.1.33.Fork26\netty-tcnative-boringssl-static-1.1.33.Fork26.jar;I:\repository\org\apache\commons\commons-lang3\3.4\commons-lang3-3.4.jar com.itheima.base.Consumer Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class io.netty.util.internal.PlatformDependent0 at io.netty.util.internal.PlatformDependent.getSystemClassLoader(PlatformDependent.java:694) at io.netty.channel.nio.NioEventLoop$4.run(NioEventLoop.java:171) at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) at io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:167) at io.netty.channel.nio.NioEventLoop.<init>(NioEventLoop.java:149) at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:102) at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:64) at io.netty.channel.MultithreadEventLoopGroup.<init>(MultithreadEventLoopGroup.java:49) at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:70) at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:65) at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:56) at org.apache.rocketmq.remoting.netty.NettyRemotingClient.<init>(NettyRemotingClient.java:122) at org.apache.rocketmq.client.impl.MQClientAPIImpl.<init>(MQClientAPIImpl.java:187) at org.apache.rocketmq.client.impl.factory.MQClientInstance.<init>(MQClientInstance.java:135) at org.apache.rocketmq.client.impl.MQClientManager.getAndCreateMQClientInstance(MQClientManager.java:53) at org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl.start(DefaultMQPushConsumerImpl.java:582) at org.apache.rocketmq.client.consumer.DefaultMQPushConsumer.start(DefaultMQPushConsumer.java:693) at com.itheima.base.Consumer.main(Consumer.java:33) Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.reflect.InaccessibleObjectException: Unable to make field long java.nio.Buffer.address accessible: module java.base does not "opens java.nio" to unnamed module @7cf10a6f [in thread "main"] at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178) at java.base/java.lang.reflect.Field.setAccessible(Field.java:172) at io.netty.util.internal.PlatformDependent0$1.run(PlatformDependent0.java:64) at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) at io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:59) at io.netty.util.internal.PlatformDependent.getSystemClassLoader(PlatformDependent.java:694) at io.netty.util.internal.PlatformDependent.isAndroid0(PlatformDependent.java:711) at io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:76) at io.netty.util.Signal.<clinit>(Signal.java:31) at io.netty.util.concurrent.DefaultPromise.<clinit>(DefaultPromise.java:42) at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:35) ... 11 more
最新发布
08-02
RocketMQ consumer 启动时出现 `java.lang.NoClassDefFoundError: Could not initialize class io.netty.util.PlatformDependent0` 以及 `ExceptionInInitializerError: Unable to make field long java.nio.Buffer.address accessible` 错误,通常与 Netty 库的类加载和 JVM 的安全管理机制有关。 ### 3.1 Netty 类加载失败的原因 `NoClassDefFoundError` 表示 JVM 在运行时无法找到某个类的定义,通常是因为该类在编译时存在,但在运行时缺失,或者类的静态初始化过程中抛出了异常。在 Netty 中,`PlatformDependent0` 是一个关键的内部类,负责与底层操作系统进行高性能的内存操作。如果该类无法初始化,会导致 `PlatformDependent` 类在使用时抛出 `NoClassDefFoundError`[^2]。 此类错误可能由以下原因导致: - Netty 的 JAR 包未正确引入或版本不兼容; - JVM 的安全管理器阻止了某些反射操作; - 类的静态初始化过程中抛出异常(如 `ExceptionInInitializerError`)。 ### 3.2 `ExceptionInInitializerError` 与 JVM 安全限制 `ExceptionInInitializerError` 通常发生在类的静态初始化块中抛出异常。在 Netty 的 `PlatformDependent0` 类中,它依赖于 Java 的 `sun.misc.*` 包进行底层内存访问。从 Java 9 开始,JVM 引入了模块系统(JPMS),默认情况下限制了对 `sun.misc` 包的访问,除非显式开启。 例如,Netty 的 `PlatformDependent0` 在静态初始化时尝试通过反射访问 `java.nio.Buffer.address` 字段,用于实现高效的内存拷贝。如果 JVM 禁止此类操作,将抛出 `IllegalAccessException` 或 `NoSuchFieldException`,从而导致 `ExceptionInInitializerError`,进而触发 `NoClassDefFoundError`[^2]。 ### 3.3 解决方案:JVM 参数调整 为了解决 Netty 的类初始化问题,可以在启动 RocketMQ consumer 时添加以下 JVM 参数,以允许访问受限的内部 API: ```bash --add-opens java.base/java.nio=ALL-UNNAMED --add-exports java.base/sun.misc=ALL-UNNAMED ``` 这些参数允许 JVM 在运行时访问 `sun.misc` 和 `java.nio` 包中的字段,从而避免反射失败导致的初始化错误。 例如,修改 RocketMQ consumer 的启动脚本: ```bash JAVA_OPT="${JAVA_OPT} -Xms256m -Xmx256m" JAVA_OPT="${JAVA_OPT} --add-opens java.base/java.nio=ALL-UNNAMED" JAVA_OPT="${JAVA_OPT} --add-exports java.base/sun.misc=ALL-UNNAMED" ``` ### 3.4 检查 Netty 依赖版本 确保 RocketMQ 使用的 Netty 版本兼容当前的 JVM 环境。低版本的 Netty(如 4.0.x)对 `sun.misc` 的依赖较强,容易在 Java 9+ 环境下出现类加载问题。建议升级到 Netty 4.1.x 或更高版本,以获得更好的兼容性和安全性。 可以通过以下方式检查当前 RocketMQ 使用的 Netty 版本: ```bash ls lib/netty-*.jar ``` 若版本过低,建议替换为最新稳定版本的 Netty JAR 包,并重新测试启动流程。 ### 3.5 静态初始化失败的排查方法 若怀疑是类的静态初始化失败导致的 `NoClassDefFoundError`,可通过以下方式排查: - 查看日志中是否包含 `ExceptionInInitializerError`; - 使用 `-verbose:class` JVM 参数查看类加载过程; - 检查 Netty 的源码,确认 `PlatformDependent0` 是否在静态块中执行了非法操作; - 使用 `jdb` 或 `jstack` 工具附加到进程,分析类加载状态。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值