阿里的rocketmq使用

目录

笔者在实际操作中,遇到需要使用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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值