Spring boot RocketMQ消费者等待结果回调
我正在使用RocketMQ,希望从队列中获取每个新请求的消息Spring boot RocketMQ消费者等待结果回调,spring-boot,consumer,countdownlatch,rocketmq,Spring Boot,Consumer,Countdownlatch,Rocketmq,我正在使用RocketMQ,希望从队列中获取每个新请求的消息 @Service public class GetMessageFromQueue extends BaseObject { @Resource private RocketMQTemplate rocketMQTemplate; @Value("${demo.rocketmq.topic}") private String springTopic; private String ms; public void getMessa
@Service
public class GetMessageFromQueue extends BaseObject {
@Resource
private RocketMQTemplate rocketMQTemplate;
@Value("${demo.rocketmq.topic}")
private String springTopic;
private String ms;
public void getMessage(InternalRequest internalRequest) throws MyExeption {
logger.info("sending message='{}'", inputData.getData());
CountDownLatch loginLatch = new CountDownLatch (1);
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(inputData.getCorrID());
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
try {
//get message by TAG to filter only messsage I want
consumer.subscribe(springTopic, inputData.getCorrID());
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
logger.info("consumeMessage " + msgs.size());
for (MessageExt messageExt : msgs) {
logger.info("consumeMessage " + new String(messageExt.getBody()));
ms = new String(messageExt.getBody());
}
loginLatch.countDown ();
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
} catch (MQClientException e) {
e.printStackTrace();
logger.error("e " + e);
}
try {
loginLatch.await ();
} catch (InterruptedException e) {
e.printStackTrace();
}
consumer.shutdown();
logger.info("ms " + ms);
if(!inputData.getCorrID().equals(ms)) {
throw new MyExeption ("500",ms,ms);
}
logger.info("get done " + ms);
}
}
@服务
公共类GetMessageFromQueue扩展了BaseObject{
@资源
私人火箭发射台火箭发射台;
@值(${demo.rocketmq.topic}”)
私人话题;
私有字符串ms;
public void getMessage(InternalRequest InternalRequest)抛出MyExeption{
info(“发送消息='{}',inputData.getData());
CountDownLatch loginLatch=新的CountDownLatch(1);
DefaultMQPushConsumer=新的DefaultMQPushConsumer(inputData.getCorrID());
consumer.setconsumerfromwhere(consumerfromwhere.consumer\u FROM\u FIRST\u OFFSET);
试一试{
//按标记获取消息以仅筛选我想要的消息
subscribe(springTopic,inputData.getCorrID());
consumer.registerMessageListener(新MessageListener)(){
@凌驾
公共ConsumerConcurrentLyStatus ConsumerMessage(列出MSG、ConsumerConcurrentLyContext上下文){
logger.info(“consumeMessage”+msgs.size());
for(MessageExt:msgs){
info(“consumeMessage”+新字符串(messageExt.getBody());
ms=新字符串(messageExt.getBody());
}
loginLatch.countDown();
返回consumerconcurrentystatus.consumer\u SUCCESS;
}
});
consumer.start();
}捕获(MQClientException e){
e、 printStackTrace();
记录器错误(“e”+e);
}
试一试{
loginLatch.await();
}捕捉(中断异常e){
e、 printStackTrace();
}
consumer.shutdown();
记录器信息(“毫秒”+毫秒);
如果(!inputData.getCorrID().equals(ms)){
抛出新的MyExeption(“500”,毫秒,毫秒);
}
logger.info(“完成”+ms);
}
}
此代码在正常情况下工作正常。
但是,如果我运行多个并发线程,ms varrable有时无法从MessageListenerConcurrent回调中获得确切的值
我哪里错了?
我怎么能在这里等待消费者的结果呢?我认为这个计划其实很奇怪。让我指出一些错误的东西,这样你就可以找出你的实际问题