application.yml
rocketmq:
name-server: dev-mqsrv.icbf.plus:9876
producer:
group: customerbasic-group-test-huang
#目的地(topic:tag)
#topic
topic: customerbasic-topic-test-huang
#sync tag(同步消息tag)
sync-tag: anran-sync-tags
#async tag(异步消息tag)
async-tag: anran-async-tags
#oneway tag(单向消息tag)
oneway-tag: anran-oneway-tags
#消费者配置
mq:
consumer:
group: customerbasic-group-test-huang
#监听主题
topic: customerbasic-topic-test-huang
RocketProducer 消息生产者(策略模式)
@Component
public class RocketProducer {
@Resource
private RocketMQTemplate rocketMQTemplate;
@Value("${rocketmq.producer.topic}")
private String topic;
public SendStatus sendMessage(String tag, Object body) {
String top = topic;
String uuid = IdUtil.randomUUID();
Message<Object> message = MessageBuilder.withPayload(body)
.setHeader("KEYS", uuid)
.setHeader("authUser",
BaseUserUtil.getAuthUserNoThrows() == null ? "" : JSON.toJSONString(BaseUserUtil.getAuthUserNoThrows())).build();
SendResult sendResult = rocketMQTemplate.syncSend(top + ":" + tag, message);
return sendResult.getSendStatus();
}
public SendStatus sendMessage(String topic, String tag, Object body) {
String uuid = IdUtil.randomUUID();
Message<Object> message = MessageBuilder.withPayload(body)
.setHeader("KEYS", uuid)
.setHeader("authUser",
BaseUserUtil.getAuthUserNoThrows() == null ? "" : JSON.toJSONString(BaseUserUtil.getAuthUserNoThrows())).build();
SendResult sendResult = rocketMQTemplate.syncSend(topic + ":" + tag, message);
return sendResult.getSendStatus();
}
}
RocketConsumer 消费者
@Component
@Slf4j
@RocketMQMessageListener(
consumerGroup = "${mq.consumer.group}",
topic = "${mq.consumer.topic}")
public class RocketConsumer implements RocketMQListener<Message>, RocketMQPushConsumerLifecycleListener {
@Override
public void onMessage(Message message) {
try {
core(message);
RocketConstants.CustomerBeanEnum enumByTar = RocketConstants.CustomerBeanEnum.getEnumByTar(message.getTags());
log.info("消费者接受到消息,message:{},beanName:{},method:{}", JSON.toJSONString(new String(message.getBody())),enumByTar.getBean(),enumByTar.getMethod());
//获取对应场景实现类
ConsumerService consumerService = SpringUtil.getBean(enumByTar.getBean());
//执行方法
ReflectUtil.invoke(consumerService, enumByTar.getMethod(),message);
} catch (Exception e) {
log.error("处理消息失败后续可以加mysql表记录异常消息,message:{}",JSON.toJSONString(new String(message.getBody())),e);
}
}
private void core(Message message) {
String authUser = message.getUserProperty("authUser");
if (StringUtils.isNotEmpty(authUser)) {
AuthUserThreadLocal.setBaseAuthUser(JSON.parseObject(authUser, BaseAuthUser.class));
}
}
@Override
public void prepareStart(DefaultMQPushConsumer consumer) {
}
消费公共类
public interface ConsumerService {
}
@Slf4j
@Service
public class OffQcImpl implements ConsumerService {
}
反射类
public class RocketConstants {
/**
* 消费实现类
*/
public enum CustomerBeanEnum {
/**
* 刷新用户数据权限
*/
CONSUMER_REFRESH_USER_PERMISSION_IMPL("REFRESH_USER_PERMISSION", "refreshUserPermissionServiceImpl", "trigger");
@Getter
private final String tag;
@Getter
private final String bean;
@Getter
private final String method;
CustomerBeanEnum(String tar, String bean, String method) {
this.tag = tar;
this.bean = bean;
this.method = method;
}
public static CustomerBeanEnum getEnumByTar(String tar) {
for (CustomerBeanEnum statusEnum : CustomerBeanEnum.values()) {
if (statusEnum.getTag().equals(tar)) {
return statusEnum;
}
}
throw new IllegalArgumentException("bean is not found,没有找到的tag值为:" + tar);
}
}
}
调用
/**
* 发送RocketMQ消息
*
* @param tag
* @param body
*/
public Boolean sendRocketMsg(String tag, Object body) {
try {
SendStatus sendStatus = rocketProducer.sendMessage(tag, body);
if (sendStatus == SendStatus.SEND_OK) {
return true;
} else {
log.error("任务消息发送失败,Rocket异常信息{}", JSONUtil.toJsonStr(sendStatus));
}
} catch (Exception e) {
log.error("任务消息发送失败,异常信息{}", e);
}
return false;
}