[
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 <[email protected]>
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)