rocketmq icon indicating copy to clipboard operation
rocketmq copied to clipboard

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

Open qingchunchencheng opened this issue 1 year ago • 6 comments

Before Creating the Bug Report

  • [X] I found a bug, not just asking a question, which should be created in GitHub Discussions.

  • [X] I have searched the GitHub Issues and GitHub Discussions of this repository and believe that this is not a duplicate.

  • [X] I have confirmed that this bug belongs to the current repository, not other repositories of RocketMQ.

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 avatar Jul 31 '24 09:07 qingchunchencheng

version: '3.9' networks: dmp: name: dmp driver: bridge services: rmqnamesrv: image: apache/rocketmq:5.2.0 container_name: rmqnamesrv ports: - 9876:9876 volumes: - /imedical/rocketmq/nameserver/logs:/home/rocketmq/logs restart: always environment: TZ: Asia/Shanghai JAVA_OPT_EXT: "-server -Xms128m -Xmx128m -Xmn128m" privileged: true command: sh mqnamesrv -n 192.168.182.110:9876 networks: dmp: aliases: - rmqnamesrv

rmqbroker: image: apache/rocketmq:5.2.0 container_name: rmqbroker ports: - 10911:10911 - 10912:10912 - 10909:10909 - 28087:8080 - 28088:8081 volumes: - /imedical/rocketmq/broker/logs:/home/rocketmq/logs - /imedical/rocketmq/broker/store:/home/rocketmq/store - /imedical/rocketmq/broker/conf:/home/rocketmq/conf restart: always environment: TZ: Asia/Shanghai JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m" privileged: true command: sh mqbroker -c /home/rocketmq/conf/broker.conf --enable-proxy -pc /home/rocketmq/conf/rmq-proxy.json networks: dmp: aliases: - rmqbroker

rmqdashboard: image: apacherocketmq/rocketmq-dashboard container_name: rocketmq-dashboard ports: - 9101:8080 restart: always environment: TZ: Asia/Shanghai JAVA_OPTS: -Drocketmq.namesrv.addr=192.168.182.110:9876 privileged: true networks: dmp: aliases: - rmqdashboard

qingchunchencheng avatar Jul 31 '24 09:07 qingchunchencheng

根据您提供的错误信息,问题似乎出在生产者初始化并尝试发送消息时,服务状态检查失败,具体表现为服务已处于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/ 。 提供了各类学习资料,以及专家答疑

answeropensource avatar Aug 12 '24 01:08 answeropensource

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

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

leizhiyuan avatar Aug 22 '24 23:08 leizhiyuan

proxy 使用默认端口 8080 8081就不好了

Yeyang-tt avatar Feb 19 '25 15:02 Yeyang-tt

我这里修改了grpc的默认端口,比如把8081改为了18081,就会出现这错误。 因为我是使用docker-composer启动的,后来尝试把容器内的端口一起改为18081,问题就解决了。

gxfan avatar Mar 19 '25 07:03 gxfan

修改配置文件 proxy.json -> "useEndpointPortFromRequest": true org.apache.rocketmq.proxy.grpc.v2.route.RouteActivity.java

lmxsoft avatar Apr 14 '25 03:04 lmxsoft

我这里修改了grpc的默认端口,比如把8081改为了18081,就会出现这错误。 因为我是使用docker-composer启动的,后来尝试把容器内的端口一起改为18081,问题就解决了。

这个方式有用

unravelyt avatar Aug 28 '25 09:08 unravelyt