apache / rocketmq

Apache RocketMQ is a cloud native messaging and streaming platform, making it simple to build event-driven applications.
https://rocketmq.apache.org/
Apache License 2.0
21.11k stars 11.63k forks source link

[Bug] docker部署5.2.0版本,开启proxy后,发送消息报错 #8470

Open qingchunchencheng opened 1 month ago

qingchunchencheng commented 1 month ago

Before Creating the Bug Report

Runtime platform environment

centos,docker

RocketMQ version

5.1.4|5.2.0

JDK Version

jdk1.8

Describe the Bug

生产消息时报错 Exception in thread "main" java.lang.IllegalStateException: Expected the service ProducerImpl-0 [FAILED] to be RUNNING, but the service has FAILED at org.apache.rocketmq.shaded.com.google.common.util.concurrent.AbstractService.checkCurrentState(AbstractService.java:381) at org.apache.rocketmq.shaded.com.google.common.util.concurrent.AbstractService.awaitRunning(AbstractService.java:305) at org.apache.rocketmq.shaded.com.google.common.util.concurrent.AbstractIdleService.awaitRunning(AbstractIdleService.java:165) at org.apache.rocketmq.client.java.impl.producer.ProducerBuilderImpl.build(ProducerBuilderImpl.java:93) at ProducerExample.main(ProducerExample.java:31) Caused by: java.util.concurrent.CancellationException: Task was cancelled. at org.apache.rocketmq.shaded.com.google.common.util.concurrent.AbstractFuture.cancellationExceptionWithCause(AbstractFuture.java:1543) at org.apache.rocketmq.shaded.com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:586) at org.apache.rocketmq.shaded.com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:567) at org.apache.rocketmq.shaded.com.google.common.util.concurrent.FluentFuture$TrustedFuture.get(FluentFuture.java:91) at org.apache.rocketmq.client.java.impl.ClientImpl.startUp(ClientImpl.java:188) at org.apache.rocketmq.client.java.impl.producer.ProducerImpl.startUp(ProducerImpl.java:114) at org.apache.rocketmq.shaded.com.google.common.util.concurrent.AbstractIdleService$DelegateService$1.run(AbstractIdleService.java:62) at org.apache.rocketmq.shaded.com.google.common.util.concurrent.Callables.lambda$threadRenaming$3(Callables.java:103) at java.lang.Thread.run(Thread.java:750)

Steps to Reproduce

import org.apache.rocketmq.client.apis.ClientConfiguration; import org.apache.rocketmq.client.apis.ClientConfigurationBuilder; import org.apache.rocketmq.client.apis.ClientException; import org.apache.rocketmq.client.apis.ClientServiceProvider; import org.apache.rocketmq.client.apis.message.Message; import org.apache.rocketmq.client.apis.producer.Producer; import org.apache.rocketmq.client.apis.producer.SendReceipt; import org.slf4j.Logger; import org.slf4j.LoggerFactory;

import java.io.IOException;

public class ProducerExample {

public static void main(String[] args) throws ClientException, IOException {
    // 接入点地址,需要设置成Proxy的地址和端口列表,一般是xxx:8080;xxx:8081。

// String endpoint = "192.168.182.110:50001"; String endpoint = "192.168.182.110:28087"; // 消息发送的目标Topic名称,需要提前创建。 // String topic = "TestTopic"; String topic = "test"; ClientServiceProvider provider = ClientServiceProvider.loadService(); ClientConfigurationBuilder builder = ClientConfiguration.newBuilder().setEndpoints(endpoint); ClientConfiguration configuration = builder.build(); // 初始化Producer时需要设置通信配置以及预绑定的Topic。 Producer producer = provider.newProducerBuilder() .setTopics(topic) .setClientConfiguration(configuration) .build(); // 普通消息发送。 Message message = provider.newMessageBuilder() .setTopic(topic) // 设置消息索引键,可根据关键字精确查找某条消息。 .setKeys("messageKey") // 设置消息Tag,用于消费端根据指定Tag过滤消息。 .setTag("messageTag") // 消息体。 .setBody("messageBody1".getBytes()) .build(); try { System.out.println("开始发送"); // 发送消息,需要关注发送结果,并捕获失败等异常。 SendReceipt sendReceipt = producer.send(message); System.out.println("发送成功"); log.info("Send message successfully, messageId={}", sendReceipt.getMessageId()); } catch (ClientException e) { System.out.println("失败"); log.error("Failed to send message", e); } //producer.close(); } }

What Did You Expect to See?

正常能发送消息

What Did You See Instead?

报错如上

Additional Context

local模式和cluster模式都测试过,均有问题

qingchunchencheng commented 1 month ago

version: '3.9' networks: dmp: name: dmp driver: bridge services: rmqnamesrv: image: apache/rocketmq:5.2.0 container_name: rmqnamesrv ports:

answeropensource commented 1 month ago

根据您提供的错误信息,问题似乎出在生产者初始化并尝试发送消息时,服务状态检查失败,具体表现为服务已处于FAILED状态。这通常意味着RocketMQ客户端在启动或连接到Broker过程中遇到了问题。结合您使用的RocketMQ版本(5.1.4或5.2.0)和Java环境(JDK 1.8),以下是一些可能的原因分析及建议步骤,尽管提供的知识片段未直接涵盖此特定异常的解决方案,但我们可以依据通用故障排查原则进行分析:

原因分析: 网络问题:客户端无法成功连接到RocketMQ代理服务器。请确认endpoint配置的地址和端口是否正确,且代理服务器正在运行并且可访问。 配置错误:客户端配置可能有误,例如认证信息、超时设置等不正确。 资源限制:客户端所在环境可能存在资源限制(如CPU、内存或网络带宽),导致服务初始化失败。 版本兼容性:尽管概率较低,但不同版本的RocketMQ客户端与服务端之间可能存在兼容性问题。 服务端问题:RocketMQ服务端可能未正确配置或存在异常,阻止了客户端的正常连接。

解决步骤: 验证网络连通性: 确认endpoint配置正确无误,尝试使用ping或telnet命令检查与RocketMQ服务端的网络连通性。 检查日志: 查看RocketMQ客户端和服务器端的日志文件,寻找有关错误的详细信息,这些日志可能会提供更具体的失败原因。 核对配置: 仔细检查application.properties或直接在代码中设置的客户端配置,确保所有必要的配置项(如name-server地址、组名等)正确无误。 资源检查: 确认客户端运行环境(CentOS或Docker容器)没有资源限制,特别是当部署在资源受限的容器环境中时,要确保分配足够的资源。 版本兼容性验证: 如果怀疑是版本兼容性问题,请查阅RocketMQ官方文档确认您的客户端版本与服务端版本之间的兼容性。 服务端健康检查: 确保RocketMQ服务端运行正常,包括但不限于检查服务端日志、状态监控、集群健康状况等。 异常处理调整: 在代码中增加更详细的异常处理逻辑,以便于捕获并记录更详尽的错误信息,这有助于进一步定位问题。 结论解释: 以上步骤旨在帮助您从多个维度排查和解决生产者初始化失败的问题。通过逐一验证网络、配置、资源、版本兼容性以及服务端状态,您可以逐步缩小问题范围并找到根本原因。请注意,实际操作中可能需要根据具体情况灵活调整排查策略。

由于提供的知识片段未直接包含与该问题完全匹配的解决方案,以上建议基于通用的故障排除逻辑。希望这些建议能帮助您解决问题。

参考链接: *专家经验:收发消息的例子


如需要更深入学习了解rocketmq ,可以访问&收藏这个网站:https://rocketmq-learning.com/ 。 提供了各类学习资料,以及专家答疑

leizhiyuan commented 3 weeks ago

看看sdk日志 $HOME/logs/rocketmq/rocketmq-client.log

另外也看看服务端的broker.log和proxy.log日志,有没有更详细的错误