/*
 * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
 *
 * https://www.mall4j.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */

package com.yami.shop.admin.config;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
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.cloud.commons.util.InetUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * xxl-job配置类，用于配置和初始化与XXL-JOB相关的执行器等信息，以实现定时任务通过XXL-JOB来执行的功能。
 * 
 * 以下是关于这段代码为何部分被注释掉的详细说明：
 * 起初项目原本使用Spring的Quartz来做定时任务，但遇到一个问题，文档中写明了需要忽略数据库大小写，
 * 然而实际情况是很多人并不会去仔细查看文档，导致在使用Quartz做定时任务时出现各种问题，所以决定舍弃Quartz的方式。
 * 进而考虑采用XXL-JOB来执行定时任务，但是又出现了新的问题，就是很多人同样也不会去查看文档，更不会主动去下载并配置XXL-JOB，
 * 所以为了避免不必要的启动报错等情况（因为如果不配置好XXL-JOB直接启动相关代码会出错），就先将与XXL-JOB配置相关的代码注释掉了。
 * 
 * 如果有人确实有使用XXL-JOB执行定时任务的需求，那么操作步骤如下：
 * 1. 先自行下载XXL-JOB，并按照要求进行相关配置，启动xxl-job-admin服务。
 * 2. 将需要执行的定时任务（比如取消订单、确认收货之类的定时任务）添加到xxl-job-admin中进行管理。
 * 3. 最后把下面被注释掉的代码取消注释，这样在启动项目时，就能够连接到XXL-JOB，进而通过它来执行定时任务了。
 * 
 * @author FrozenWatermelon
 * @date 2021/1/18
 */
@Configuration
public class XxlJobConfig {
    // 创建一个日志记录器，用于记录与XXL-JOB配置相关的日志信息，方便后续排查问题以及了解配置初始化等过程的情况。
    private final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    // 通过@Value注解从配置文件中读取xxl-job.admin.addresses属性值，该值代表了XXL-JOB管理端的地址，用于执行器与管理端进行通信连接。
    @Value("${xxl-job.admin.addresses}")
    private String adminAddresses;

    // 通过@Value注解从配置文件中读取xxl-job.accessToken属性值，该值作为访问令牌，用于在执行器与XXL-JOB管理端通信时进行身份验证等安全相关操作。
    @Value("${xxl-job.accessToken}")
    private String accessToken;

    // 通过@Value注解从配置文件中读取xxl-job.logPath属性值，该值指定了定时任务执行日志的存储路径，方便后续查看任务执行情况以及排查可能出现的问题。
    @Value("${xxl-job.logPath}")
    private String logPath;

    // 通过@Value注解从配置文件中读取server.port属性值，即当前项目服务所监听的端口号，后续可能会基于此端口号来确定执行器相关的端口等信息（这里是做了端口偏移使用）。
    @Value("${server.port}")
    private int port;

    // 注入InetUtils对象，该对象是Spring Cloud提供的一个工具类，用于处理网络相关的操作，在这里主要用于获取合适的IP地址，
    // 特别是在多网卡、容器内部署等复杂网络环境下，能够帮助准确获取到执行器要绑定的IP地址，避免IP地址获取不准确导致的通信问题。
    @Autowired
    private InetUtils inetUtils;

    // 以下是配置XXL-JOB执行器的方法，目前被注释掉了，原因在类的开头注释部分已经详细说明了。
    // 如果要启用XXL-JOB执行定时任务，需要取消这段代码的注释，并确保已经正确配置好了XXL-JOB相关环境。
    // @Bean注解表示该方法会创建一个Spring管理的Bean对象，在这里就是创建一个XxlJobSpringExecutor类型的Bean，
    // 该对象是XXL-JOB在Spring环境下的执行器实现类，负责与XXL-JOB管理端交互以及执行具体的定时任务等操作。
//    @Bean
//    public XxlJobSpringExecutor xxlJobExecutor() {
//
//        // 记录一条日志信息，表示开始进行XXL-JOB配置初始化，方便在启动项目时查看相关配置是否正常加载等情况。
//        logger.info(">>>>>>>>>>> xxl-job config init.");
//        // 创建一个XxlJobSpringExecutor实例，用于后续配置并返回作为Spring管理的Bean对象。
//        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
//        // 设置XXL-JOB管理端的地址，让执行器知道要与哪个管理端进行通信连接，这个地址就是从配置文件中读取到的adminAddresses的值。
//        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
//        // 设置应用名称，这里固定设置为"mall4j"，在XXL-JOB管理端可以通过这个名称来区分不同的执行器所属的应用，方便管理和监控。
//        xxlJobSpringExecutor.setAppname("mall4j");
//        // 针对多网卡、容器内部署等情况，借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP，
//        // 通过调用InetUtils的findFirstNonLoopbackAddress方法获取到第一个非回环地址（即有效的网络IP地址），并设置为执行器绑定的IP地址，
//        // 确保执行器能够在复杂网络环境下正确地与XXL-JOB管理端进行通信。
//        xxlJobSpringExecutor.setIp(inetUtils.findFirstNonLoopbackAddress().getHostAddress());
//        // 设置执行器监听的端口号，这里采用了项目服务端口号（port）加上1000的方式来确定，避免端口冲突等问题，同时也方便统一管理端口分配。
//        xxlJobSpringExecutor.setPort(port + 1000);
//        // 设置访问令牌，用于在执行器与XXL-JOB管理端通信时进行身份验证等安全相关操作，这个值就是从配置文件中读取到的accessToken的值。
//        xxlJobSpringExecutor.setAccessToken(accessToken);
//        // 设置定时任务执行日志的存储路径，方便后续查看任务执行情况以及排查可能出现的问题，这个值就是从配置文件中读取到的logPath的值。
//        xxlJobSpringExecutor.setLogPath(logPath);
//        // 设置日志保留天数，这里设置为3天，表示定时任务执行日志只会保留最近3天的记录，超过这个天数的旧日志会被自动清理，
//        // 这样可以避免日志文件过多占用磁盘空间，同时也能保证在一定时间范围内可以查看历史任务执行情况。
//        xxlJobSpringExecutor.setLogRetentionDays(3);
//        return xxlJobSpringExecutor;
//    }

}