qunarcorp / qmq

QMQ是去哪儿网内部广泛使用的消息中间件,自2012年诞生以来在去哪儿网所有业务场景中广泛的应用,包括跟交易息息相关的订单场景; 也包括报价搜索等高吞吐量场景。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

1.1.30 版本中非Spring环境手动pull时 空指针异常

Aboysky opened this issue · comments

commented

问题描述
在手动pull模式下,MetaInfoService 中的 request方法中的setRequestType方法空指针异常。原因由于第一次获取ClusterFuture时MetaInfoRequestParam对象中的reqestType为null,未被设置值。
版本关系
查阅过1.1.20和1.1.28的源码,不会导致此问题

环境配置
pom文件(部分,环境就是qmq的master分支启动的服务)

    <groupId>com.qunar.qmq</groupId>
    <artifactId>qmq-parent</artifactId>
    <version>1.1.30</version>
    <packaging>pom</packaging>

代码

public class ConsumerTest {
    private static final Logger LOG = LoggerFactory.getLogger(ConsumerTest.class);

    private static final ExecutorService executor = Executors.newFixedThreadPool(3);

    public static void main(String[] args) throws Exception {

//推荐一个应用里只创建一个实例
        MessageConsumerProvider consumer = new MessageConsumerProvider();
        consumer.setAppCode("consumer_app");
        consumer.setMetaServer("http://localhost:8080/meta/address");
        consumer.init();


        PullConsumer pullConsumer = consumer.getOrCreatePullConsumer("test.demo.qmq", "testdemo", false);
        List<Message> messages = pullConsumer.pull(10, 30);
        for(Message message : messages){

            message.ack(1000, null);
            System.out.println(message.getMessageId());

            //处理失败,则ack的第二个参数传入Throwable对象
            //message.ack(1000, new Exception("消费失败"));
        }

        System.in.read();

    }
}

出错代码
package qunar.tc.qmq.metainfoclient;
class:MetaInfoService
image
image
复现步骤

  1. 拉取master指定版本的master分支
  2. 执行测试代码

实际输出结果

java.lang.NullPointerException: null
	at qunar.tc.qmq.protocol.consumer.MetaInfoRequest.setRequestType(MetaInfoRequest.java:96)
	at qunar.tc.qmq.metainfoclient.MetaInfoService.request(MetaInfoService.java:128)
	at qunar.tc.qmq.metainfoclient.MetaInfoService.requestWrapper(MetaInfoService.java:114)
	at qunar.tc.qmq.broker.impl.BrokerServiceImpl.request(BrokerServiceImpl.java:180)
	at qunar.tc.qmq.broker.impl.BrokerServiceImpl.getClusterBySubject(BrokerServiceImpl.java:145)
	at qunar.tc.qmq.consumer.pull.PlainPullEntry.pull(PlainPullEntry.java:45)
	at qunar.tc.qmq.consumer.pull.DefaultPullConsumer.doPull(DefaultPullConsumer.java:126)
	at qunar.tc.qmq.consumer.pull.DefaultPullConsumer.run(DefaultPullConsumer.java:114)
	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:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at qunar.tc.qmq.concurrent.NamedThreadFactory$1.run(NamedThreadFactory.java:52)
	at java.lang.Thread.run(Thread.java:748)

简单解决方案
request.setRequestType(param.getRequestType());一行注释掉

commented

这个问题应该已经修复了。