[ https://issues.apache.org/jira/browse/ROCKETMQ-101?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15867908#comment-15867908 ]
ASF GitHub Bot commented on ROCKETMQ-101: ----------------------------------------- GitHub user Jaskey opened a pull request: https://github.com/apache/incubator-rocketmq/pull/63 [ROCKETMQ-101]Fix possible NullPointerException when retry in send Async way JIRA: https://issues.apache.org/jira/browse/ROCKETMQ-101 You can merge this pull request into a Git repository by running: $ git pull https://github.com/Jaskey/incubator-rocketmq ROCKETMQ-101-NPE-when-retry Alternatively you can review and apply these changes as the patch at: https://github.com/apache/incubator-rocketmq/pull/63.patch To close this pull request, make a commit to your master/trunk branch with (at least) the following in the commit message: This closes #63 ---- commit 81baaf6a2165e2fb947aab56c1b03e7646f65b44 Author: Jaskey <linjunjie1...@gmail.com> Date: 2017-02-15T14:17:47Z Fix possible NullPointerException when retry in send Async way ---- > Possible NullPointerException when retry in send Async way > ---------------------------------------------------------- > > Key: ROCKETMQ-101 > URL: https://issues.apache.org/jira/browse/ROCKETMQ-101 > Project: Apache RocketMQ > Issue Type: Bug > Components: rocketmq-client > Reporter: Jaskey Lam > Assignee: Xiaorui Wang > > When retry async send, possible NPE will occure: > java.lang.NullPointerException: null > at > com.alibaba.rocketmq.client.latency.MQFaultStrategy.selectOneMessageQueue(MQFaultStrategy.java:91) > ~[classes/:na] > at > com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.selectOneMessageQueue(DefaultMQProducerImpl.java:404) > ~[classes/:na] > at > com.alibaba.rocketmq.client.impl.MQClientAPIImpl.onExceptionImpl(MQClientAPIImpl.java:385) > ~[classes/:na] > at > com.alibaba.rocketmq.client.impl.MQClientAPIImpl.access$100(MQClientAPIImpl.java:72) > ~[classes/:na] > at > com.alibaba.rocketmq.client.impl.MQClientAPIImpl$1.operationComplete(MQClientAPIImpl.java:356) > ~[classes/:na] > at > com.alibaba.rocketmq.remoting.netty.ResponseFuture.executeInvokeCallback(ResponseFuture.java:58) > ~[classes/:na] > at > com.alibaba.rocketmq.remoting.netty.NettyRemotingAbstract.scanResponseTable(NettyRemotingAbstract.java:255) > ~[classes/:na] > at > com.alibaba.rocketmq.remoting.netty.NettyRemotingClient$5.run(NettyRemotingClient.java:165) > [classes/:na] > at java.util.TimerThread.mainLoop(Timer.java:555) [na:1.7.0_80] > at java.util.TimerThread.run(Timer.java:505) [na:1.7.0_80] > The problem is : when selectOneMessageQueue in MQFaultStrategy, the > topicPublishInfo which is just passed from sendKernelImpl, will be possiblly > null, which causes NPE. > There are some places where sendKernelImpl wii have null TopicPublishInfo, > for example : > private SendResult sendSelectImpl(// > Message msg, // > MessageQueueSelector selector, // > Object arg, // > final CommunicationMode > communicationMode, // > final SendCallback sendCallback, final > long timeout// > ) throws MQClientException, RemotingException, MQBrokerException, > InterruptedException { > this.makeSureStateOK(); > Validators.checkMessage(msg, this.defaultMQProducer); > TopicPublishInfo topicPublishInfo = > this.tryToFindTopicPublishInfo(msg.getTopic()); > if (topicPublishInfo != null && topicPublishInfo.ok()) { > MessageQueue mq = null; > try { > mq = selector.select(topicPublishInfo.getMessageQueueList(), > msg, arg); > } catch (Throwable e) { > throw new MQClientException("select message queue throws > exception.", e); > } > if (mq != null) { > return this.sendKernelImpl(msg, mq, communicationMode, > sendCallback, null, timeout);//here, the topicroutinfo is null, which has the > risk of NPE > } else { > throw new MQClientException("select message queue return > null.", null); > } > } > throw new MQClientException("No route info for this topic, " + > msg.getTopic(), null); > } > This NPE will make retry fail, and even ,onException callback fail to be > called -- This message was sent by Atlassian JIRA (v6.3.15#6346)