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);
}
}