You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@rocketmq.apache.org by "Jaskey Lam (JIRA)" <ji...@apache.org> on 2017/02/15 14:04:41 UTC

[jira] [Created] (ROCKETMQ-101) Possible NullPointerException when retry in send Async way

Jaskey Lam created ROCKETMQ-101:
-----------------------------------

             Summary: 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)