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