rocketmq listener

PayResultConsumerConfig
package com.cream.couponapp.config;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.message.MessageExt;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import java.util.List;

@Configuration
public abstract class PayResultConsumerConfig {

    private static final Logger log = LoggerFactory.getLogger(PayResultConsumerConfig.class);

    @Value("${rocketmq.consumer.pay.groupName}")
    private String groupName;
    @Value("${rocketmq.consumer.pay.namesrvAddr}")
    private String namesrvAddr;

    public void consumer(String topic,String tag) throws MQClientException {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(groupName);
        consumer.setNamesrvAddr(namesrvAddr);
        consumer.subscribe(topic,tag);
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                return PayResultConsumerConfig.this.dealBody(msgs);
            }
        });
        consumer.start();
        log.info("rocketmq启动成功-----------------------");
    }
    public abstract ConsumeConcurrentlyStatus dealBody(List<MessageExt> msgs) ;

}

payResultListener
package com.cream.couponapp.listener;
import com.alibaba.fastjson.JSONObject;
import com.cream.couponapp.config.PayResultConsumerConfig;
import com.cream.couponapp.dto.OrderCouponDto;
import com.cream.couponapp.service.CouponService;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.message.MessageExt;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.util.List;

@Service
public class payResultListener extends PayResultConsumerConfig implements ApplicationListener<ContextRefreshedEvent> {

    private static final Logger log = LoggerFactory.getLogger(payResultListener.class);

    @Resource
    private CouponService couponService;

    @Override
    public ConsumeConcurrentlyStatus dealBody(List<MessageExt> msgs) {
        msgs.forEach(msg->{
            byte[] bytes = msg.getBody();
            try{
                String msgStr = new String(bytes,"utf-8");
                log.info("pay result receive msg:{}",msgStr);
                OrderCouponDto orderCouponDto = JSONObject.parseObject(msgStr,OrderCouponDto.class);
                couponService.payResult(orderCouponDto.getOrderId(),orderCouponDto.getUserId());
            } catch (UnsupportedEncodingException e) {
                log.error("body转字符串失败");
            }
        });
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        try{
            super.consumer("payResult","Tag1");
        } catch (MQClientException e) {
            log.error("payResult 监听器启动失败", e);
        }
    }
}

RocketMQ监听器是用于监听RocketMQ消息的回调函数。当消费者接收到RocketMQ的消息时,监听器会被触发,并执行相应的逻辑处理。 在RocketMQ中,有两种类型的监听器:MessageListener和MessageListenerConcurrently。 1. MessageListener:该监听器适用于顺序消费模式,即消息的消费必须按照消息发送的顺序进行处理。当消费者接收到消息时,MessageListener会按照顺序逐个处理消息,确保消费的顺序性。 2. MessageListenerConcurrently:该监听器适用于并发消费模式,即消息的消费可以同时进行。当消费者接收到消息时,MessageListenerConcurrently会以多线程的方式并发处理消息,提高消息的处理效率。 为了使用RocketMQ监听器,你需要实现相应的接口并重写其中的方法。例如,对于Java客户端,你可以实现RocketMQ的MessageListener接口或MessageListenerConcurrently接口,并在实现类中实现onMessage方法,该方法会在接收到消息时被触发。 示例代码如下: ```java import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; import org.apache.rocketmq.common.message.MessageExt; import java.util.List; public class MyMessageListener implements MessageListenerConcurrently { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> messages, ConsumeConcurrentlyContext context) { for (MessageExt message : messages) { // 处理消息逻辑 System.out.println("Received message: " + new String(message.getBody())); } return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } } ``` 以上代码是一个简单的RocketMQ消息监听器的示例,当消费者接收到消息时,会打印消息的内容。你可以根据实际需求,在consumeMessage方法中编写自己的业务逻辑。 注意:RocketMQ的监听器需要与消费者进行绑定,具体的绑定方式可以参考RocketMQ官方文档或相关的教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值