目录
笔者在实际操作中,遇到需要使用mq的地方,无奈所有的 官方文档都是一个吊样,反正就是让你无法再一遍之内全部看懂,所以我就放弃了,直接上代码
首先就是引入包
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>ons-client</artifactId>
<version>${ons-client.version}</version>
</dependency>
一堆配置
#---------mq生产者配置----------------
aliyun.producer.mq.topic=XXX_PAY_ASSET
#鉴权用AccessKey,在阿里云服务器管理控制台创建
aliyun.mq.accessKey=xxxx
#鉴权用SecretKey,在阿里云服务器管理控制台创建
aliyun.mq.secretKey=xxxxx
#地址服务器
aliyun.mq.onsAddr=http://onsaddr-internet.aliyun.com/rocketmq/nsaddr4client-internet
----------以上是公共配置-------------
#件队列名称
aliyun.mq.topic=xx_risk_control_test
#MQ队列配置信息
aliyun.mq.consumer.consumerId=CID_APPLY_STATUS_TEST
#队列消息分隔符
aliyun.mq.consumer.subExpression=TAG_APPLY_STATUS_TEST
------------以上是消费者配置----------
#件队列名称
aliyun.mq.topic=xx_risk_control_test
aliyun.producer.pay.cosumerId=CID_APPLY_TESTs
aliyun.producer.pay.subExpression=TAG_APPLY_TESTs
------------以上是生产者配置----------
配置类
@Component("commonConfig")
public class IMQCommonConfig {
@Value("${aliyun.mq.onsAddr}")
private String producerAddr;
@Value("${aliyun.mq.secretKey}")
private String producerSecretKey;
@Value("${aliyun.mq.accessKey}")
private String producerAccessKey;
@Value("${aliyun.producer.mq.topic}")
private String producerPayTopic;
@Value("${aliyun.producer.asset.pay.cosumerId}")
private String producerPayCosumerId;
@Value("${aliyun.producer.asset.pay.subExpression}")
private String producerPaysubExp;
抽象listener
public interface IMQListener {
String handle(String msg) throws Exception;
}
具体的实现类
@Component("IMQListenerxxx")
public class IMQListenerJufan implements IMQListener {
@Override
public String handle(String msg) throws Exception {
return validateBlacklist(msg);
}
public String validateBlacklist(String applyId) {
/**
* 做一些业务操作
*/
return null;
}
}
生产者生产消息
import com.aliyun.openservices.ons.api.*;
/**
* mq生产者服务类
*/
@Component
public class MQProducerService {
private static final Logger logger = LoggerFactory.getLogger(MQProducerService.class);
private static Producer producer;
public static Producer getProducer() { return producer; }
@Autowired
private IMQCommonConfig commonConfig;
@Autowired
private IMQListener IMQListenerxxx;
/*
mqService.sendCallNotConnect(creditQueue.getApplyId(), creditStep.getId());
MessageQueueProducer.send(PropertiesConfigure.getMqTopic(), "XJFQ_MANUAL_REPAYMENT_STATUS", "", content, 30);
实际调用的时候
*/
public boolean sendCallNotConnect(String applyId, String stepId) {
return send(commonConfig.getProducerPaysubExp(), applyId, stepId);
}
@PostConstruct
public void init() {
Properties properties = new Properties();
properties.put(PropertyKeyConst.ProducerId,"PID_RISK_MSG");
properties.put(PropertyKeyConst.AccessKey, "LTAIUSNkcn9f3vrk");
properties.put(PropertyKeyConst.SecretKey, "LUjoaZgcckg8V1RHwRMJYyAuXe8QiQ");
properties.put(PropertyKeyConst.ONSAddr, commonConfig.getProducerAddr());
producer = ONSFactory.createProducer(properties);
//在发送消息前,必须调用start方法来启动Producer,只需调用一次即可。
producer.start();
properties = new Properties();
properties.put(PropertyKeyConst.AccessKey, "LTAIUSNkcn9f3vrk");
properties.put(PropertyKeyConst.SecretKey, "LUjoaZgcckg8V1RHwRMJYyAuXe8QiQ");
/** demo */
properties.put(PropertyKeyConst.ConsumerId, commonConfig.getProducerPayCosumerId());
Consumer consumer1 = ONSFactory.createConsumer(properties);
consumer1.subscribe(commonConfig.getProducerPayTopic(), commonConfig.getProducerPaysubExp(), new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
return listener(message, commonConfig.getProducerPaysubExp(), message.getKey(), IMQListenerJufan);
}
});
consumer1.start();
System.out.println("MQ demo start 1");
}
public Action listener(Message message, String tag, String key, IMQListener listener) {
String msg = "";
try {
msg = new String(message.getBody(), "UTF-8");
String result = listener.handle(msg);
if ("sucess".equals(result)) {
// saveLogMq(tag, "2", key, msg, "1", result);
return Action.CommitMessage; //mq会根据这个返回值,决定是否再次通知 阿里默认16次 通知
} else {
//saveLogMq(tag, "2", message.getKey(), msg, "0", result);
return Action.ReconsumeLater;
}
} catch (Exception e) {
e.printStackTrace();
//saveLogMq(tag, "2", message.getKey(), msg, "0", e.getMessage());
return Action.ReconsumeLater;
}
}
public boolean send(String tag, String key, String msgBody) {
return send(tag, key, msgBody, null);
}
public boolean send(String tag, String key, String msgBody, Integer delaySeconds) {
try {
Message msg = new Message(commonConfig.getProducerPayTopic(), tag, msgBody.getBytes("UTF-8"));
msg.setKey(key);
if (delaySeconds != null) {
long delayTime = 1000 * delaySeconds;
msg.setStartDeliverTime(System.currentTimeMillis() + delayTime);
}
SendResult sendResult = getProducer().send(msg);
// saveLogMq(tag, "1", key, msgBody, "1", JSON.toJSONString(sendResult));
return true;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
// saveLogMq(tag, "1", key, msgBody, "0", e.getMessage());
return false;
}
}
}
消费者配置类
public class MqQueueConfig {
// 获取队列与CUSTOMER_ID
private String consumerId;
// 鉴权用AccessKey,在阿里云服务器管理控制台创建
private String accessKey;
// 鉴权用SecretKey,在阿里云服务器管理控制台创建
private String secretKey;
消费者消费消息
就是加载配置之后,开始监听 订阅的消息
@Component
public class MQConsumerService{
//消费者集合
private List<Consumer> consumerLst = new ArrayList<Consumer>();
//接收队列
@Resource(name = "windAuditQueue")
private MqQueueConfig windAuditQueue;
@Bean(name = "windAuditQueue")
@ConfigurationProperties(prefix = "aliyun.mq")
public MqQueueConfig initWindAuditQueue() {
return new MqQueueConfig();
}
@PostConstruct /*缓存数据加载完成,初始化MQ*/
public void postMethod() {
logger.info("mq init load start...");
ThreadPoolUtil.commonPool.execute(new Runnable() {
// 初始化 订单审核 等
@Override
public void run() {
windAuditQuqueInit();
}
});
}
public void windAuditQuqueInit() {
Consumer consumer = productConsumer(ConsumerTypeEnum.ORDER_AUDI, windAuditQueue);
// 初始化接收队的消息:补件消息
consumer.subscribe(windAuditQueue.getTopic(), windAuditQueue.getSubExpression(), new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
try {
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
MDC.put(LOG_THREAD_ID, uuid);
ApplySupplementInfo suppInfo = convertObjByMsg(message, "0", ApplySupplementInfo.class);
execute(suppInfo);
} catch (Exception e) {
logger.error("MQ消息处理异常 {}", e);
} finally {
MDC.remove(LOG_THREAD_ID);
}
return Action.CommitMessage;
}
});
consumer.start();
consumerLst.add(consumer);
}
public class ConsumerFactory {
public static final Integer PARAM=0x0F;
/**
* 如果后续再加其他消息处理队列,值只需要 添加对应的config和enum
* @param consumerTypeEnum
* @param config
* @return
*/
public static Consumer productConsumer(ConsumerTypeEnum consumerTypeEnum,MqQueueConfig config){
Properties properties = new Properties();
properties.put(PropertyKeyConst.ConsumerId, config.getConsumerId());
properties.put(PropertyKeyConst.AccessKey, config.getAccessKey());
properties.put(PropertyKeyConst.SecretKey, config.getSecretKey());
properties.put(PropertyKeyConst.ONSAddr, config.getOnsAddr());
return ONSFactory.createConsumer(properties);
}
}