MsgConsumer .java
import javax.annotation.PostConstruct; import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; import org.apache.rocketmq.common.consumer.ConsumeFromWhere; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.remoting.common.RemotingHelper; @Component public class MsgConsumer { //消费者的组名 @Value("${apache.rocketmq.consumer.PushConsumer}") private String consumerGroup; //NameServer 地址 @Value("${apache.rocketmq.namesrvAddr}") private String namesrvAddr; @PostConstruct//spring初始化注解,只会调用一次 public void defaultMQPushConsumer() { //消费者的组名 DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(consumerGroup); //指定NameServer地址,多个地址以 ; 隔开 consumer.setNamesrvAddr(namesrvAddr); try { //设置consumer所订阅的Topic和Tag,*代表全部的Tag //consumer.subscribe("testOrderTopic", "*"); consumer.subscribe("testOrderTopic", "order"); //consumer.subscribe("testCommentTopic", "comment"); //CONSUME_FROM_LAST_OFFSET 默认策略,从该队列最尾开始消费,跳过历史消息 //CONSUME_FROM_FIRST_OFFSET 从队列最开始开始消费,即历史消息(还储存在broker的)全部消费一遍 consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET); //MessageListenerOrderly 这个是有序的 //MessageListenerConcurrently 这个是无序的,并行的方式处理,效率高很多 consumer.registerMessageListener((MessageListenerConcurrently) (list, context) -> { try { for (MessageExt messageExt : list) { System.out.println("messageExt: " + messageExt);//输出消息内容 String messageBody = new String(messageExt.getBody(), RemotingHelper.DEFAULT_CHARSET); System.out.println("消费响应:msgId : " + messageExt.getMsgId() + ", msgBody : " + messageBody);//输出消息内容 } } catch (Exception e) { e.printStackTrace(); return ConsumeConcurrentlyStatus.RECONSUME_LATER; //稍后再试 } return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; //消费成功 }); consumer.start(); } catch (Exception e) { e.printStackTrace(); } } }
来源:51CTO
作者:吾行远方
链接:https://blog.csdn.net/wxyf2018/article/details/100727657