1.1.30 版本中非Spring环境手动pull时 空指针异常
Aboysky opened this issue · comments
Huan 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
复现步骤
- 拉取master指定版本的master分支
- 执行测试代码
实际输出结果
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());
一行注释掉
Keli commented
这个问题应该已经修复了。