Buggy code:
public class DefaultMQProducer extends ClientConfig implements MQProducer { protected final transient DefaultMQProducerImpl defaultMQProducerImpl ; private String producerGroup ; private String createTopicKey = MixAll . DEFAULT_TOPIC ; private volatile int defaultTopicQueueNums = 4 ; private int sendMsgTimeout = 3000 ; private int compressMsgBodyOverHowmuch = 1024 * 4 ; private int retryTimesWhenSendFailed = 2 ; private boolean retryAnotherBrokerWhenNotStoreOK = false ; private int maxMessageSize = 1024 * 128 ; private boolean unitMode = false ; public DefaultMQProducer ( ) { } public DefaultMQProducer ( final String producerGroup ) { } public DefaultMQProducer ( RPCHook rpcHook ) { } public DefaultMQProducer ( final String producerGroup , RPCHook rpcHook ) { } @ Override public void start ( ) throws MQClientException { } @ Override public void shutdown ( ) { } @ Override public List < MessageQueue > fetchPublishMessageQueues ( String topic ) throws MQClientException { } @ Override public SendResult send ( Message msg ) throws MQBrokerException , MQClientException , RemotingException , InterruptedException { } @ Override public SendResult send ( Message msg , long timeout ) throws MQBrokerException , MQClientException , RemotingException , InterruptedException { } @ Override public void send ( Message msg , SendCallback sendCallback ) throws MQClientException , RemotingException , InterruptedException { } @ Override public void send ( Message msg , SendCallback sendCallback , long timeout ) throws MQClientException , RemotingException , InterruptedException { } @ Override public void sendOneway ( Message msg ) throws MQClientException , RemotingException , InterruptedException { } @ Override public SendResult send ( Message msg , MessageQueue mq ) throws MQBrokerException , MQClientException , RemotingException , InterruptedException { } @ Override public SendResult send ( Message msg , MessageQueue mq , long timeout ) throws MQBrokerException , MQClientException , RemotingException , InterruptedException { } @ Override public void send ( Message msg , MessageQueue mq , SendCallback sendCallback ) throws MQClientException , RemotingException , InterruptedException { <START_BUG> send ( msg , mq , sendCallback ) ; <END_BUG> } @ Override public void send ( Message msg , MessageQueue mq , SendCallback sendCallback , long timeout ) throws MQClientException , RemotingException , InterruptedException { } @ Override public void sendOneway ( Message msg , MessageQueue mq ) throws MQClientException , RemotingException , InterruptedException { } @ Override public SendResult send ( Message msg , MessageQueueSelector selector , Object arg ) throws MQBrokerException , MQClientException , RemotingException , InterruptedException { } @ Override public SendResult send ( Message msg , MessageQueueSelector selector , Object arg , long timeout ) throws MQBrokerException , MQClientException , RemotingException , InterruptedException { } @ Override public void send ( Message msg , MessageQueueSelector selector , Object arg , SendCallback sendCallback ) throws MQClientException , RemotingException , InterruptedException { } @ Override public void send ( Message msg , MessageQueueSelector selector , Object arg , SendCallback sendCallback , long timeout ) throws MQClientException , RemotingException , InterruptedException { } @ Override public void sendOneway ( Message msg , MessageQueueSelector selector , Object arg ) throws MQClientException , RemotingException , InterruptedException { } @ Override public TransactionSendResult sendMessageInTransaction ( Message msg , LocalTransactionExecuter tranExecuter , final Object arg ) throws MQClientException { } @ Override public void createTopic ( String key , String newTopic , int queueNum ) throws MQClientException { } @ Override public void createTopic ( String key , String newTopic , int queueNum , int topicSysFlag ) throws MQClientException { } @ Override public long searchOffset ( MessageQueue mq , long timestamp ) throws MQClientException { } @ Override public long maxOffset ( MessageQueue mq ) throws MQClientException { } @ Override public long minOffset ( MessageQueue mq ) throws MQClientException { } @ Override public long earliestMsgStoreTime ( MessageQueue mq ) throws MQClientException { } @ Override public MessageExt viewMessage ( String msgId ) throws MQBrokerException , MQClientException , RemotingException , InterruptedException { } @ Override public QueryResult queryMessage ( String topic , String key , int maxNum , long begin , long end ) throws MQClientException , InterruptedException { } public String getProducerGroup ( ) { } public void setProducerGroup ( String producerGroup ) { } public String getCreateTopicKey ( ) { } public void setCreateTopicKey ( String createTopicKey ) { } public int getSendMsgTimeout ( ) { } public void setSendMsgTimeout ( int sendMsgTimeout ) { } public int getCompressMsgBodyOverHowmuch ( ) { } public void setCompressMsgBodyOverHowmuch ( int compressMsgBodyOverHowmuch ) { } public DefaultMQProducerImpl getDefaultMQProducerImpl ( ) { } public boolean isRetryAnotherBrokerWhenNotStoreOK ( ) { } public void setRetryAnotherBrokerWhenNotStoreOK ( boolean retryAnotherBrokerWhenNotStoreOK ) { } public int getMaxMessageSize ( ) { } public void setMaxMessageSize ( int maxMessageSize ) { } public int getDefaultTopicQueueNums ( ) { } public void setDefaultTopicQueueNums ( int defaultTopicQueueNums ) { } public int getRetryTimesWhenSendFailed ( ) { } public void setRetryTimesWhenSendFailed ( int retryTimesWhenSendFailed ) { } public boolean isUnitMode ( ) { } public void setUnitMode ( boolean isUnitMode ) { } }

Fix:
this . defaultMQProducerImpl . send ( msg , mq , sendCallback ) ;