Rocket MQ消费消息的两种写法

Rocket MQ消费消息代码示例:

第一种继承:AbstractMessageListener


import cn.com.fsg.common.util.monitor.TraceUtils;
import cn.com.fsg.ihro.pay.constant.PayGlobalConstants;
import cn.com.fsg.ihro.pay.dto.PayApplRespDTO;
import cn.com.fsg.ihro.pay.manager.consumer.message.PayApplSingleMessage;
import cn.com.fsg.ihro.pay.support.util.StringSubUtils;
import cn.com.fsg.plugins.rocketmq.core.listener.AbstractMessageListener;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Map;

/**
 * 单笔付款结果 MQ消费
 *
 * @author zkg
 * @since 2024-09-06 16:11:19
 */
@Slf4j
@Component
@RocketMQMessageListener(topic = PayGlobalConstants.PAY_APPL_SINGLE_TOPIC, consumerGroup = PayGlobalConstants.PAY_APPL_SINGLE_CONSUMER_GROUP, selectorExpression = PayGlobalConstants.PAY_APPL_SINGLE_TAG)
public class PayApplSingleConsumer extends AbstractMessageListener<PayApplSingleMessage> {

    @Resource
    private Map<String, PayApplSingleApi> serviceMap;

    @Override
    protected void handleMessage(PayApplSingleMessage message) {
        TraceUtils.setDefaultTraceId();
        try {
            log.info("PayApplSingleConsumer====单笔付款结果====message: {}", message);

            PayApplRespDTO data = message.getData();
            // 截取编码code
            String code = StringSubUtils.substring(data.getPayReqBizBatId());

            log.info("PayApplSingleConsumer====单笔付款结果====payReqBizBatId: {},code: {}",data.getPayReqBizBatId(), code);
            // 调用service
            serviceMap.get(code).handleMessage(data);

            log.info("PayApplSingleConsumer====单笔付款结果====end");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("PayApplSingleConsumer====单笔付款结果====异常: {}", e.getMessage());
        }
    }

}

第二种:实现RocketMQListener

/**
 * 付款结果消费客户端
 */
@Slf4j
@RocketMQMessageListener(topic = FIN_CDPS_BATCH_PAYMENT_STATUS_TOPIC, consumerGroup = FIN_CDPS_BATCH_PAYMENT_STATUS_GROUP, selectorExpression = FIN_CDPS_BATCH_PAYMENT_STATUS_TAG)
@Component
@Profile({"local", "uat", "prod"})
public class PaymentStatusConsumer implements RocketMQListener<String> {

    @Resource
    private Map<String, PaymentStatusConsumerApi> consumerMap;

    @PostConstruct
    public void init() {
        consumerMap.forEach((k, v) -> {
            log.info("消费组件名称: {}, 组件实现类:{}", k, v.getClass());
        });
    }

    @Override
    public void onMessage(String message) {
        TraceUtils.setDefaultTraceId();
        try {
            PaymentStatusMessage paymentStatusMessage = JsonUtils.parseObject(message, PaymentStatusMessage.class);
            String busNo = paymentStatusMessage.getData().getPayReqBizBatId();
            String[] numbers = busNo.split(SPLITS[0]);
            log.info("付款结果消费返回业务单号:{}", busNo);
            Assert.isTrue(ArrayUtil.isNotEmpty(numbers));
            consumerMap.get(numbers[1]).doExecute(paymentStatusMessage);
        } catch (Exception e) {
            log.error("付款结果消息消费异常: ", e);
        }
    }
}

StringSubUtils

public class StringSubUtils {

    /**
     * 截取编码code
     *
     * @param str 字符串
     * @return 结果
     */
    public static String substring(String str) {
        // 获取第一个"-"的位置并加1跳过"-"本身
        int startIndex = str.indexOf("-") + 1;
        // 从startIndex位置向后查找第二个"-"的位置
        int endIndex = str.indexOf("-", startIndex);
        // 使用substring方法截取内容
        return str.substring(startIndex, endIndex);
    }

    public static void main(String[] args) {
        String str = "text-要截取的内容-endtext-111-111";
        String result = substring(str);
        System.out.println(result);
    }

}
RocketMQ中,发送消息时可以指定消息发送到哪个Broker节点。可以通过设置MessageQueueSelector来实现。 以下是一个示例代码: ```java import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.client.producer.MessageQueueSelector; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.common.message.MessageQueue; import org.apache.rocketmq.remoting.common.RemotingHelper; import java.util.List; public class MyProducer { private static final String NAMESRV_ADDR = "localhost:9876"; private static final String TOPIC_NAME = "my-topic"; private static final String TAG_NAME = "my-tag"; public static void main(String[] args) throws Exception { DefaultMQProducer producer = new DefaultMQProducer("my-group"); producer.setNamesrvAddr(NAMESRV_ADDR); producer.start(); for (int i = 0; i < 100; i++) { Message message = new Message(TOPIC_NAME, TAG_NAME, ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET)); producer.send(message, new MyMessageQueueSelector(), i); } producer.shutdown(); } private static class MyMessageQueueSelector implements MessageQueueSelector { @Override public MessageQueue select(List<MessageQueue> list, Message message, Object o) { int id = (int) o; int index = id % list.size(); return list.get(index); } } } ``` 在MyProducer中,我们通过DefaultMQProducer来发送消息。在发送消息时,通过设置MessageQueueSelector来指定发送到哪个Broker节点。 MyMessageQueueSelector中的select方法返回消息队列的下标,根据下标来选择发送到哪个Broker节点。 需要注意的是,如果要实现发送到指定的Broker节点,需要先了解RocketMQ的Broker节点分配策略,确保选择的Broker节点是符合要求的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java知识技术分享

感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值