获取项目启动时的参数

package net.fan.init;

import lombok.extern.slf4j.Slf4j;
import net.fan.common.FileUtil;
import net.fan.common.SpringUtils;
import net.fan.domain.TimeModel;
import net.fan.domain.WeatherType;
import net.fan.service.base.BaseHandleService;
import net.fan.service.ncep.NcepServiceImpl;
import net.fan.service.rain.RainServiceImpl;
import net.fan.service.sand.SandServiceImpl;
import net.fan.service.strongconvection.StrongConvServiceImpl;
import net.fan.service.temperature.TemperatureServiceImpl;
import net.fan.service.wind.WindServiceImpl;
import org.apache.commons.cli.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 命令行参数解析
 */
@Slf4j
@Component
public class StartupRunner implements CommandLineRunner {
    //保存所有算法的集合
    private List<String> typesList;
    //micaps3输出路径
    private String rootpath;
    //可选参数
    private TimeModel timeModel;
    //ini文件路径
    private String iniFile;
    //实例类型
    private String type;

    public StartupRunner() {
        this.timeModel = TimeModel.builder().build();
    }

    /**
     * @param args
     * @throws Exception
     */
    @Override
    public void run(String... args) throws Exception {
        CommandLineParser parser = new PosixParser();
        Options options = new Options();

        // 使用 $ java -jar App.jar -h
        options.addOption("h", "help", false, "参数信息");
        // ini文件路径,必传
        options.addOption("file", "", true, "ini配置文件路径");
        // 实例类型,必传
        options.addOption("type", "", true, "实例类型,格式:wind/rain/temp");
        // 时间段,沙尘查询,可选
        options.addOption("anytime", "", true, "时间段,格式以逗号隔开:YYYYMMDDHH,YYYYMMDDHH");

        CommandLine commandLine = parser.parse(options, args);

        HelpFormatter hf = new HelpFormatter();

        // 打印使用帮助
        if (commandLine.hasOption("h")) {
            hf.printHelp("cma", options, true);
        }

        //必传参数判断
        vitifyRequiredParams(commandLine);
        if (StringUtils.isAnyBlank(iniFile, type)) {
            return;
        }

        // 解析ini文件
        processIni();
        if (CollectionUtils.isEmpty(typesList)) {
            return;
        }

        //可选参数判断
        vitifyOptionalParams(commandLine);

        // 识别实例类型,执行算法
        processArithmetic(type);

        //执行完成退出
        System.exit(0);
    }

    /**
     * 必选参数判断
     *
     * @param commandLine
     */
    private void vitifyRequiredParams(CommandLine commandLine) {
        //必传参数判断
        if (!commandLine.hasOption("file") || !commandLine.hasOption("type")) {
            return;
        }
        //必传参数值判断
        this.iniFile = commandLine.getOptionValue("file");
        this.type = commandLine.getOptionValue("type");
    }

    /**
     * 可选参数判断
     *
     * @param commandLine
     */
    private void vitifyOptionalParams(CommandLine commandLine) {
        //可选参数判断
        if (commandLine.hasOption("anytime")) {
            String anytime = commandLine.getOptionValue("anytime");
            if (StringUtils.isNotBlank(anytime)) {
                this.timeModel.setAnyTime(anytime);
            }
        }
        if (commandLine.hasOption("dateTime")) {
            String dateTime = commandLine.getOptionValue("dateTime");
            if (StringUtils.isNotBlank(dateTime)) {
                this.timeModel.setDateTime(dateTime);
            }
        }
    }

    /**
     * 解析ini文件并保存处理文件里的数据
     */
    private void processIni() {
        // 解析ini文件
        Map<String, String> map = FileUtil.readIniFile(iniFile);
        if (CollectionUtils.isEmpty(map)) {
            return;
        }
        //micaps3输出路径
        this.rootpath = map.get("rootpath");
        //对应算法
        String types = map.get("types");
        // ini文件参数判断
        if (StringUtils.isAnyBlank(rootpath, types)) {
            return;
        }
        String[] typesArr = types.split(",");
        this.typesList = Arrays.asList(typesArr);
    }


    /**
     * 算法处理
     *
     * @param clazz
     * @param <T>
     */
    private <T extends BaseHandleService> void processHandle(Class<T> clazz) {
        T instance = SpringUtils.getBean(clazz);
        if (Objects.isNull(instance)) {
            return;
        }

        if(!CollectionUtils.isEmpty(typesList)){
            typesList.stream().forEach(t->{
                try {
                    WeatherType weatherType = WeatherType.builder().type(t).rootpath(rootpath).timeModel(timeModel).build();
                    instance.handle(weatherType);
                    log.info("执行算法 {} 完成。", t);
                } catch (Exception e) {
                    log.error("{} 对应的算法错误,错误信息:{}。", t, e.getMessage());
                }
            });
        }
    }

    /**
     * 执行算法
     *
     * @param type
     */
    private void processArithmetic(String type) {
        if (StringUtils.isBlank(type)) {
            return;
        }
        switch (type) {
            case "wind":
                processHandle(WindServiceImpl.class);
                break;
            case "rain":
                processHandle(RainServiceImpl.class);
                break;
            case "temperature":
                processHandle(TemperatureServiceImpl.class);
                break;
            case "necp":
                processHandle(NcepServiceImpl.class);
                break;
            case "sand":
                processHandle(SandServiceImpl.class);
                break;
            case "strongconv":
                processHandle(StrongConvServiceImpl.class);
                break;
            default:
                break;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值