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.19k stars 11.67k forks source link

DefaultMQPushConsumer start invokSync call timeout #1886

Closed andrezheng-git closed 4 years ago

andrezheng-git commented 4 years ago

When DefaultMQPushConsumer start when inject in a springboot container,it throws a ivokeSync call timeout. If Thread.sleep ahead of the start(), the exception does not be trowed. How to solve the problem.

            consumer = new DefaultMQPushConsumer(consumerGroupName);
            consumer.setNamesrvAddr(nameServerAddr);
            consumer.setConsumeTimeout(1000000);
            consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
            consumer.subscribe(topicName, "*");
            consumer.registerMessageListener(messageListener);
            //Thread.sleep(3000);
            consumer.start();

Caused by: java.lang.IllegalStateException: org.apache.rocketmq.remoting.exception.RemotingTimeoutException: invokeSync call timeout at org.apache.rocketmq.client.impl.factory.MQClientInstance.updateTopicRouteInfoFromNameServer(MQClientInstance.java:681) at org.apache.rocketmq.client.impl.factory.MQClientInstance.updateTopicRouteInfoFromNameServer(MQClientInstance.java:511) at org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl.updateTopicSubscribeInfoWhenSubscriptionChanged(DefaultMQPushConsumerImpl.java:868) at org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl.start(DefaultMQPushConsumerImpl.java:649) at org.apache.rocketmq.client.consumer.DefaultMQPushConsumer.start(DefaultMQPushConsumer.java:693) at XXX.MQConsumer.init(MQConsumer.java:58) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1922) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1864) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) ... 16 common frames omitted Caused by: org.apache.rocketmq.remoting.exception.RemotingTimeoutException: invokeSync call timeout at org.apache.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:371) at org.apache.rocketmq.client.impl.MQClientAPIImpl.getTopicRouteInfoFromNameServer(MQClientAPIImpl.java:1371) at org.apache.rocketmq.client.impl.MQClientAPIImpl.getTopicRouteInfoFromNameServer(MQClientAPIImpl.java:1361) at org.apache.rocketmq.client.impl.factory.MQClientInstance.updateTopicRouteInfoFromNameServer(MQClientInstance.java:624) ... 28 common frames omitted

RongtongJin commented 4 years ago

From the exception stack, it seems that the consumer connection to nameserver has timed out. Is nameserver and consumer started at the same time? In addition, it is recommended to use rocketmq-spring, if you want quickly integrate RocketMQ with Spring Boot.

RongtongJin commented 4 years ago

I will close the Issue first, but please feel free to reopen it if you have any other issues. Issues are generally used for bug reports and feature requests, so it is recommended to discuss questions on the mailing list first, the mailing list address [https://rocketmq.apache.org/about/contact/],

lihengjie commented 3 years ago

我也遇到这个问题了,不加Thread.sleep(3000),正常启动会报错。 但是如果debug模式,一步一步启动不报错。 加上sleep之后,启动正常。 匪夷所思~~~

heihaozi commented 3 years ago

Add the following code before consumer.start();:

DefaultChannelId.newInstance();

The exception will not be thrown.

wenbinai commented 3 years ago

Add the following code before consumer.start();:

DefaultChannelId.newInstance();

The exception will not be thrown.

使用这个方法成功了,这个是什么原因,楼主知道吗

heihaozi commented 3 years ago

Add the following code before consumer.start();:

DefaultChannelId.newInstance();

The exception will not be thrown.

使用这个方法成功了,这个是什么原因,楼主知道吗

In the static code block of DefaultChannelId, it takes a lot of time to obtain the corresponding IP by using the host name, and it may have passed 5 seconds in a portable mac notebook computer.

Click to see more details.

odbozhou commented 1 year ago

https://stackoverflow.com/questions/41512483/runtimemxbean-getname-hangs-on-mac-os-x-sierra-how-to-fix

如果使用的是mac操作系统,应该是这个原因导致的,执行下这个命令就能解决 scutil --set HostName $(scutil --get LocalHostName)