package com.snowalker.notify.mq.payment.consumer;

import com.snowalker.notify.common.service.WalletService;
import com.snowalker.notify.common.util.LogExceptionWapper;
import com.snowalker.order.charge.message.constant.MessageProtocolConst;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * @author snowalker
 * @version 1.0
 * @date 2019/6/12 9:46
 * @className WalletPaymentConsumer
 * @desc 扣款消息消费者
 */
@Component
public class WalletPaymentConsumer {

    private static final Logger LOGGER = LoggerFactory.getLogger(WalletPaymentConsumer.class);

    @Value("${rocketmq.nameServer}")
    String nameSrvAddr;

    @Autowired
    WalletService walletService;

    @Resource(name = "walletPaymentMsgListenerImpl")
    private MessageListenerConcurrently messageListener;

    private DefaultMQPushConsumer defaultMQPushConsumer;

    @PostConstruct
    public void init() {
        defaultMQPushConsumer = new DefaultMQPushConsumer(MessageProtocolConst.WALLET_PAYMENT_TOPIC.getConsumerGroup());
        defaultMQPushConsumer.setNamesrvAddr(nameSrvAddr);
        // 从头开始消费
        defaultMQPushConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        // 消费模式:集群模式
        defaultMQPushConsumer.setMessageModel(MessageModel.CLUSTERING);
        // 注册监听器
        defaultMQPushConsumer.registerMessageListener(messageListener);
        // 订阅所有消息
        try {
            defaultMQPushConsumer.subscribe(MessageProtocolConst.WALLET_PAYMENT_TOPIC.getTopic(), "*");
            defaultMQPushConsumer.start();
        } catch (MQClientException e) {
            LOGGER.error("[扣款消息消费者]--WalletPaymentConsumer加载异常!e={}", LogExceptionWapper.getStackTrace(e));
            throw new RuntimeException("[扣款消息消费者]--WalletPaymentConsumer加载异常!", e);
        }
        LOGGER.info("[扣款消息消费者]--WalletPaymentConsumer加载完成!");
    }
}