2022-09-01 在java项目中执行linux命令

背景: 为何会用到这个呢?
事情是这样的,最近在做nebula图数据库的导入,导入的时候,用的是官方推荐的插件 nebula-import ,这个插件是一个二进制文件,在linux中直接运行它的命令,并指定配置文件 xxx.yaml即可 将csv导入到 图数据库中;所以便衍生了此需求,在java程序中调用linux命令;

Process exec = Runtime.getRuntime().exec("./nebula-importer --config " + yamlFile, null, new File(importerPath));
int resutl =   exec.waitFor() ; // 0 失败 1 成功

exec 方法是一个重载方法,这里采用三入参的这个

粘贴一段 Runtime.java中的代码

    public Process exec(String command, String[] envp, File dir)
        throws IOException {
        if (command.length() == 0)
            throw new IllegalArgumentException("Empty command");

        StringTokenizer st = new StringTokenizer(command);
        String[] cmdarray = new String[st.countTokens()];
        for (int i = 0; st.hasMoreTokens(); i++)
            cmdarray[i] = st.nextToken();
        return exec(cmdarray, envp, dir);
    }

commamd 执行的命令
envp 设置环境变量 例如此linux服务器上的java环境变量 我这里无需设置 为null
dir 将要执行命令的 linux 文件所在路径 (例如 这个配置文件在/opt/data/aa.yaml,那么此处写为 new File("/opt/data/"))

至此 其实已经完成了java中执行linux 命令,然后说下这次项目中的重点 难点
1 项目导入需要生成一个yml配置文件,需要用程序实现
2 在java中实现linux中nebula-import 的导入命令执行 上述已经实现

   //客户端配置
        TemplateBean templateBean = new TemplateBean();
        String logPath = filePath + "/logFile";
        makeDir(logPath);
        templateBean.setLogPath(String.format("%s/%s.log", logPath, fileName));
        TemplateBean.ClientSettings clientSettings = new TemplateBean.ClientSettings();
        clientSettings.setConnection(new TemplateBean.Connection());
        clientSettings.setSpace(importBean.getSpace());
        templateBean.setClientSettings(clientSettings);
        //文件配置
        List<TemplateBean.File> fileList = new ArrayList<>();
        // 点
        getVertex(importBean, fileList);
        //边
        getEdge(importBean, fileList);
        templateBean.setFiles(fileList);
        String yamlFilePath = filePath + "/yamlFile";
        makeDir(yamlFilePath);
        DumperOptions dumperOptions = new DumperOptions();
        dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
        Yaml yaml = new Yaml(dumperOptions);
        String yamlFile = String.format("%s/%s.yaml", yamlFilePath, fileName);
        yaml.dump(templateBean, new FileWriter(yamlFile));

生成yaml配置文件的实体

import lombok.Data;

import java.util.List;

/**
 * @ClassName= TemplateBean
 */
@Data
public class TemplateBean {

    private String version = "v3";
    private String description = "web console import";
    private Boolean removeTempFiles = false;
    private ClientSettings clientSettings;
    private String logPath;
    private List<File> files;


    @Data
    public static class File {
        private String path;
        private String failDataPath;
        private Integer batchSize = 60;
        private String limit;
        private String inOrder;
        private String type = "csv";
        private CSV csv;
        private Schema schema;
    }

    @Data
    public static class CSV {
        private Boolean withHeader = false;
        private Boolean withLabel = false;
        private String delimiter;
    }

    @Data
    public static class Schema {
        private String type = "vertex";
        private Vertex vertex;
        private Edge edge;
    }

    @Data
    public static class Edge {
        private String name = "order";
        private Boolean withRanking = false;
        private List<Prop> props;
        private SrcDst srcVID;
        private SrcDst dstVID;
        private Integer rank;
    }


    @Data
    public static class SrcDst {
        private Integer index = 1;
        private String function = "";
        private String type = "string";
        private String prefix = "";
    }


    @Data
    public static class Vertex {
        private Vid vid;
        private List<Tag> tags;
    }


    @Data
    public static class Vid {
        private Integer index = 0;
        private String function;
        private String type = "string";
        private String prefix;
    }


    @Data
    public static class Tag {
        private String name = "item";
        private List<Prop> props;
    }

    @Data
    public static class Prop {
        private String name = "id_single_item";
        private String type = "string";
        private Integer index = 0;
    }


    @Data
    public static class ClientSettings {
        private Integer retry = 3;
        private Integer concurrency = 10;
        private Integer channelBufferSize = 128;
        private String space = "dataImport";
        private String postStart;
        private String preStop;
        private Connection connection;
    }

    @Data
    public static class Connection {
        private String user = "root";
        private String password = "nebula";
        private String address = "127.0.0.1:9669";
    }

}

生成的yaml

!!com.example.test.bean.TemplateBean
clientSettings:
  channelBufferSize: 128
  concurrency: 10
  connection:
    address: 127.0.0.1:9669
    password: nebula
    user: root
  postStart: null
  preStop: null
  retry: 3
  space: dataImport
description: web console import
files:
- batchSize: 60
  csv:
    delimiter: null
    withHeader: false
    withLabel: false
  failDataPath: /data1/opt/itemFail.csv
  inOrder: null
  limit: null
  path: /data1/opt/item.csv
  schema:
    edge: null
    type: vertex
    vertex:
      tags:
      - name: item
        props:
        - index: 0
          name: id_single_item
          type: string
        - index: 0
          name: id_single_item
          type: string
        - index: 0
          name: id_single_item
          type: string
      vid:
        function: null
        index: 0
        prefix: null
        type: string
  type: csv
logPath: /data1/opt/import.log
removeTempFiles: null
version: v3

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容