Java org.apache.rocketmq.remoting.exception.remotingtoomuchrequesteexception:invokeAsyncImpl invoke太快
我在使用Rocket MQ(v4.1.0-Cubating)客户端时遇到了如下关键问题:Java org.apache.rocketmq.remoting.exception.remotingtoomuchrequesteexception:invokeAsyncImpl invoke太快,java,rocketmq,Java,Rocketmq,我在使用Rocket MQ(v4.1.0-Cubating)客户端时遇到了如下关键问题: 2017-10-16 16:18:12:457[ERROR][SimpleProducer$1.onException(SimpleProducer.java:44)] - send message to mq fail: org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: invokeAsyncImpl invok
2017-10-16 16:18:12:457[ERROR][SimpleProducer$1.onException(SimpleProducer.java:44)] - send message to mq fail:
org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: invokeAsyncImpl invoke too fast
at org.apache.rocketmq.remoting.netty.NettyRemotingAbstract.invokeAsyncImpl(NettyRemotingAbstract.java:422)
at org.apache.rocketmq.remoting.netty.NettyRemotingClient.invokeAsync(NettyRemotingClient.java:488)
at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessageAsync(MQClientAPIImpl.java:368)
at org.apache.rocketmq.client.impl.MQClientAPIImpl.onExceptionImpl(MQClientAPIImpl.java:455)
at org.apache.rocketmq.client.impl.MQClientAPIImpl.access$100(MQClientAPIImpl.java:156)
at org.apache.rocketmq.client.impl.MQClientAPIImpl$1.operationComplete(MQClientAPIImpl.java:417)
at org.apache.rocketmq.remoting.netty.ResponseFuture.executeInvokeCallback(ResponseFuture.java:51)
at org.apache.rocketmq.remoting.netty.NettyRemotingAbstract$2.run(NettyRemotingAbstract.java:275)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
我不知道如何解决它,即使我谷歌了很多,没有任何正确的答案
以下是我的生产商代码:
public class SimpleProducer {
static final Logger logger = LoggerFactory.getLogger(SimpleProducer.class);
static AtomicInteger total = new AtomicInteger(0);
private final static CountDownLatch mCountDownLatch = new CountDownLatch(1);
public static void main(String[] args){
logger.info("Bootstrap start...");
DefaultMQProducer producer = new DefaultMQProducer("Producer");
producer.setNamesrvAddr("192.168.137.112:9876");
try {
producer.start();
producer.setRetryTimesWhenSendAsyncFailed(3);
long start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++)
try {
{
Message msg = new Message("newTopic",
"Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
producer.send(msg, new SendCallback(){
public void onSuccess(SendResult sendResult) {
if (sendResult.getSendStatus().equals(SendStatus.SEND_OK)) {
//MsgSendResponseCounter.factory.getInstance().onSuccess();
logger.info("Succeeded send {} message, total {}", sendResult.getMsgId(), total.getAndIncrement());
}
}
public void onException(Throwable ee) {
logger.error("send message to mq fail:", ee);
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
mCountDownLatch.await();
long end = System.currentTimeMillis();
logger.info("Finished 10000000 msgs! elapsed time {} in all", (end - start)/1000);
} catch (Exception e) {
e.printStackTrace();
}finally{
producer.shutdown();
}
}
公共类SimpleProducer{
静态最终记录器Logger=LoggerFactory.getLogger(SimpleProducer.class);
静态AtomicInteger总计=新的AtomicInteger(0);
专用最终静态CountDownLatch mCountDownLatch=新的CountDownLatch(1);
公共静态void main(字符串[]args){
logger.info(“引导启动…”);
DefaultMQProducer=新的DefaultMQProducer(“producer”);
producer.setnameservaddr(“192.168.137.112:9876”);
试一试{
producer.start();
sendasyncy失败时的producer.setRetryTimes(3);
长启动=System.currentTimeMillis();
对于(int i=0;i<10000000;i++)
试一试{
{
Message msg=新消息(“newTopic”,
“Hello world”.getBytes(RemotingHelper.DEFAULT_CHARSET));
producer.send(msg,newsendcallback(){
成功时公共无效(SendResult SendResult){
if(sendResult.getSendStatus().equals(SendStatus.SEND_OK)){
//MsgSendResponseCounter.factory.getInstance().onSuccess();
info(“成功发送{}消息,总计{}”,sendResult.getMsgId(),total.getAndIncrement());
}
}
公共无效例外(可丢弃的ee){
logger.error(“向mq发送消息失败:”,ee);
}
});
}
}捕获(例外e){
e、 printStackTrace();
}
mCountDownLatch.await();
long end=System.currentTimeMillis();
info(“总共完成10000000毫秒!运行时间{}”,(结束-开始)/1000);
}捕获(例外e){
e、 printStackTrace();
}最后{
生产者关闭();
}
}
}答案其实很简单,发送速度太快,达到流量控制阈值 当您发送aysnc消息时,客户端将尝试获取许可证,在收到代理响应后,它将释放许可证 由于您以异步方式发送消息,其中
producer.send()
将返回得非常快,并且您将继续在for循环中发送消息,而不使用任何sleep mili,这将面临问题
只要在调用
producer.send
后简单地放入Thread.sleep(100),或者如果我将producer.setRetryTimesWhenSendSyncFailed(0)的值设置为0,则使用不需要SendCallBack的sync send方法;新异常如下:org.apache.rocketmq.client.exception.MQClientException:wait response timeout 3000ms有关详细信息,请访问org.apache.rocketmq.client.impl.mqclientapimpl$1.operationComplete(mqclientapimpl.java:416)org.apache.rocketmq.remoting.netty.ResponseFuture.executeInvokeCallback上的url(ResponseFuture.java:51)