@Component
@Order(10000)
public class RocketMQConsumer implements InitializingBean {
Longger logger = LoggerFactory.getLogger(RocketMQConsumer.class);
@Value("${rocketm1.namesrv.addr}")
private String namesrvAddr;
/**
* rocket topic 后缀
*/
private static final String MQ_TOPIC_SUFFIX = "_client_face_queue_7";
/**
*内部是使用长轮询Pull方式从MetaQ服务器拉消息,然后再回调用户Listener方法
*/
@Override
public void afterPropertiesSet()
throw Exception {
/**
*一个应用创建一个Consumer,由应用来维护此对象,可以设置为全局对象或者单例
*注意:ConsumerGroupName需要由应用来保证唯一。
*不同consumer group里的consumer即便是消费同一个topic下的同一个queue,
*那消费进度也是分开存储的。也就是说,不同的consumer group内的consumer的消费
*完全隔离,不受影响。
*/
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("消费者组名");
consumer.setNamesrvAddr(namesrvAddr);
consumer.setInstanceName("实例名称");
// 广播消费是指一个consumer只要订阅了某个topic的消息,那它就会收到topic下的所有queue里的消息,
// 而不管这个consumer的group是什么。所以对于广播消费来说,consumer group没什么实际意义。consumer可以在实例化时,我们可以指定是集群消费还是广播消费。
// consumer.setMessageModel(MessageModel.BROADCASTING);
/**
* 订阅指定topic下tags分别等于TagA或TagC或TagD
*/
// consumer.subscribe("TopicTest1","TagA || TagC || TagD");
/**
* 订阅指定topic下所有消息
* 注意: 一个consumer对象可以订阅多个topic
*/
// topic
String topic = "消息主题";
consumer.subscribe("主题","tag");
// 设置最大重试次数
consumer.setMaxReconsumeTiimes(30);
// 最小线程数
consumer.setConsumeThreadMin(1);
// 最大线程数
consumer.setConsumeThreadMax(5);
consumer.registerMessageListenter(new MessageListenerConcurrently() {
/**
* 默认msgs里只有一条消息通过设置consumeMessageBatchMaxSize参数来批量接收消息
*/
@Override
public consumeConcurrentlyStatus consumeMessage(List<>MessageExt,ConsumeConcurrentlyContext context) {
MessgaeExt msg = msgs.get(0);
if(msg.getTopic.equals(topic)) {
// 执行消费逻辑
try{
Map<String,Object> map = (Map)ObjectUtil.byteToObject(msg.getBody());
// 执行业务逻辑
}
catch (Exception e){
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
}
return ConsumeConsurrentlyStatus.CONSUME_SUCCESS;
}
});
/**
*Consumer对象在使用之前必须要调用start初始化,初始化一次即可
*/
consumer.start();
}
}
RocketMQ消费者
最新推荐文章于 2024-03-13 09:43:56 发布