消费activemq消息-java.io.EOFException

该代码段展示了如何从不同类型的ActiveMQ消息中获取内容,特别处理了BytesMessage类型的异常情况,通过循环读取避免了EOFException。在BytesMessage的处理中,使用StringBuilder逐个字节读取并构建消息内容。
public String getMsgContent(Message msg) {
        var rst = "";
        if (msg instanceof TextMessage) rst = ((TextMessage) msg).getText();
        else if(msg instanceof BytesMessage) rst = (BytesMessage) msg.readUTF();
        else if(msg instanceof MapMessage) rst = JSONObject.toJSONString(msg);
        else if(msg instanceof StreamMessage) rst = ((StreamMessage) msg).readString();
        else if(msg instanceof ObjectMessage) rst = JSONObject.toJSONString(msg);
        return rst;
    }

可能抛出java.io.EOFException异常 如果是BytesMessage类型消息可能是readUTF循环读取结束符后数据异常 改以下代码读取试试

else if (msg instanceof BytesMessage) {
     BytesMessage bytesMessage = (BytesMessage) msg;
     StringBuilder builder = new StringBuilder();
     byte[] b = new byte[1024];
     int len;
     while((len = bytesMessage.readBytes(b)) != -1) {
         builder.append(new String(b, 0, len));
     }
     rst = builder.toString();
     log.info("activemq. bytesMessage消息内容: " + rst);
}
<think>我们正在解决Apache ActiveMQ启动失败的问题,具体报错是端口61613(stomp协议)被占用导致Transport Connector无法注册到JMX。 根据用户提供的引用[1]和[2],问题本质是端口被占用(Address already in use)。因此,解决步骤为: 1. 确认端口61613的占用情况(找出占用进程) 2. 根据占用进程决定处理方式(结束进程或修改ActiveMQ配置) 3. 重启ActiveMQ 注意:用户之前提到过端口61616,但现在是61613(stomp端口),所以我们要针对61613进行操作。 步骤详细分解: 步骤1:查询占用端口61613的进程 Windows下使用netstat命令: netstat -ano | findstr ":61613" 步骤2:根据PID结束进程或调整 如果占用进程是无关紧要的,可以结束它;如果是重要进程,则修改ActiveMQ的配置文件,更换端口。 步骤3:修改ActiveMQ配置(如果需要) 配置文件位置:ActiveMQ安装目录下的conf/activemq.xml 找到stomp传输连接器的配置,修改端口号。 步骤4:重启ActiveMQ服务 考虑到用户可能想先尝试结束占用进程,我们给出步骤。 另外,注意ActiveMQ的配置文件中有多个传输连接器(如tcp, amqp, stomp等),需要找到对应的stomp配置。 根据引用[1]和[2]中的错误信息,类似问题的解决也是通过释放端口或修改端口。 因此,我们按照以下步骤给出解决方案: </think>### 解决 Apache ActiveMQ 启动失败(端口 61613 被占用)的完整方案 当 Apache ActiveMQ 启动时报错 `Transport Connector could not be registered in JMX`,提示 `stomp://0.0.0.0:61613` 端口被占用时,请按以下步骤解决: --- #### 步骤 1:确认端口占用情况 ```cmd netstat -ano | findstr ":61613" ``` - **预期输出**: ``` TCP 0.0.0.0:61613 0.0.0.0:0 LISTENING 1234 ``` - 末尾数字 `1234` 即占用进程的 PID[^1][^2] > ⚠️ 若输出为空,可能是防火墙拦截或 ActiveMQ 配置错误。 --- #### 步骤 2:定位占用进程 ```cmd tasklist /FI "PID eq 1234" ``` - **输出分析**: - `java.exe`:其他 Java 应用冲突 - `mysqld.exe`:数据库服务占用 - `activemq.exe`:ActiveMQ 未正常关闭 --- #### 方案 A:结束占用进程(适合非关键进程) 1. 结束进程: ```cmd taskkill /F /PID 1234 ``` 2. 重启 ActiveMQ 服务: ```cmd net stop activemq && net start activemq ``` --- #### 方案 B:修改 ActiveMQ 端口(推荐永久解决) 1. 打开配置文件: ```xml <!-- 文件路径:{ActiveMQ_HOME}/conf/activemq.xml --> <transportConnectors> <transportConnector name="stomp" uri="stomp://0.0.0.0:61613"/> </transportConnectors> ``` 2. 修改端口号(例如改为 61623): ```xml <transportConnector name="stomp" uri="stomp://0.0.0.0:61623"/> ``` 3. 重启服务: ```cmd net stop activemq net start activemq ``` > ✅ **验证**:访问 `http://localhost:8161/admin/connections.jsp` 查看新端口状态 --- #### 方案 C:释放僵尸进程(针对未关闭的 ActiveMQ) 1. 查找 Java 残留进程: ```cmd tasklist | findstr /i "java" ``` 2. 强制结束所有 ActiveMQ 相关进程: ```cmd taskkill /F /IM java.exe /FI "WINDOWTITLE eq ActiveMQ*" ``` --- ### 预防措施 1. **端口复用检测**:启动前执行 `netstat -ano|findstr 61613` 2. **服务管理**: ```cmd sc config activemq start= delayed-auto # 延迟启动避免冲突 ``` 3. **日志监控**: ```cmd tail -f {ActiveMQ_HOME}/data/activemq.log ``` --- ### 关键点解析 1. 错误根源:`java.net.BindException` 表示端口被其他进程锁定[^1][^2] 2. STOMP 协议:61613 是 ActiveMQ 默认的 STOMP 消息协议端口 3. JMX 作用:Java Management Extensions 负责监控连接器注册 通过上述操作可解决 99% 的端口占用问题。若仍报错,需检查防火墙规则(允许 61613 端口)或调整 JVM 启动参数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值