package com.sw.mes.config.rabbit;
import com.alibaba.fastjson.JSON;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.sw.mes.core.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 生产者
 * @author
 * @version 1.0
 * @date 2024/2/28 13:28
 */
@Component
@Slf4j
public class WmsRatingResultsMsgProducer {

    //队列名称（用于指定往哪个队列发送消息）
    public static final String QUEUE_NAME = "RATING_RESULT_QUEUE";

    public static final String ROUTE_KEY = "RATING_RESULT";

    public static final String EXCHANGE = "JOB_TASK_EVENT";

    @Value("${wmsMq.lk.url}")
    private String nkUrl;
    @Value("${wmsMq.lk.userName}")
    private String nkUserName;
    @Value("${wmsMq.lk.password}")
    private String nkPassWord;

    @Value("${wmsMq.lk.port}")
    private int nkPort;

//    @Value("${wmsMq.bk.url}")
//    private String bkUrl;
//    @Value("${wmsMq.bk.userName}")
//    private String bkUserName;
//    @Value("${wmsMq.bk.password}")
//    private String bkPassWord;
//    @Value("${wmsMq.bk.port}")
//    private int bkPort;

    @Async
    public void sendMsgInspectData(Object obj){
        //发送北库
//        this.sendMsg(obj, bkUrl, bkUserName, bkPassWord, bkPort);
//        //发送数据
        this.sendMsg(obj, nkUrl, nkUserName, nkPassWord, nkPort);
    }

    //进行发送操作
    public static void sendMsg(Object obj, String url, String userName, String passWord, int port){
        Connection connection = null;
        Channel channel = null;
        try {
            //创建一个连接工厂
            ConnectionFactory factory = new ConnectionFactory();
            //设置工厂IP，用于连接RabbitMQ的队列
            factory.setHost(url);
            //设置连接RabbitMQ的用户名
            factory.setUsername(userName);
            //设置连接RabbitMQ的密码
            factory.setPassword(passWord);
            //设备端口
            factory.setPort(port);
            //
            factory.setVirtualHost("/");
            //创建连接
            connection = factory.newConnection();

            //获取信道
            channel = connection.createChannel();
            /**
             * 创建队列
             * 第一个参数：队列名称
             * 第二个参数：服务器重启后队列是否还存在，即队列是否持久化,true为是，false为否，默认false，即消息存储在内存中而不是硬盘中
             * 第三个参数：该队列是否只供一个消费者进行消费，是否进行消息共享，true为只允许一个消费者进行消费，false为允许多个消费者对队列进行消费，默认false
             * 第四个参数：是否自动删除，最后一个消费者断开连接后该队列是否自动删除，true自动删除，false不自动删除
             * 第五个参数：其他参数
             */
            channel.queueDeclare(QUEUE_NAME, true, false, false, null);
            //发消息
            String message = JSON.toJSONString(obj);
            //String message = "你好，我是一个消息";
            /**
             * 用信道对消息进行发布
             * 第一个参数：发送到哪个交换机
             * 第二个参数：路由的Key值是哪个
             * 第三个参数：其他参数信息
             * 第四个参数：发送消息的消息体
             */
            channel.basicPublish(EXCHANGE, ROUTE_KEY, null, message.getBytes());

            log.info("消息发送成功 | MSG:" + JSON.toJSONString(obj));
        } catch (Exception e){
            log.info("消息发送异常！" + e.getMessage() +" | MSG:" + JSON.toJSONString(obj));
            throw new BusinessException(e.getMessage());
        }finally {
            try{
                if(channel != null)
                    channel.close();
                if(connection != null)
                    connection.close();
            }catch (IOException ex){
                throw new RuntimeException(ex.getMessage());
            } catch (TimeoutException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
