Как передать массив в качестве аргумента для jar exec в node.js - PullRequest
1 голос
/ 02 мая 2019

У меня есть 2 запроса, первый запрос собирает данные из моей таблицы заданий, а второй запрос собирает данные из моей таблицы транспортных средств, после чего обе данные сохраняются в массиве результатов. Как передать этот массив результатов в мой дочерний процесс в качестве аргумента для выполнения JAR? И есть ли какие-либо ограничения по размеру для аргументов при выполнении jar, потому что в моей рабочей таблице и таблице транспортных средств много данных. Если есть ограничение на размер аргумента, каков наилучший способ запустить файл JAR с большим размером аргумента?

var express = require('express');
var router = express.Router();

router.post('/', async function(req, res, next) {

    var date = req.param('date');
    var joblist;
    var vehiclelist;

    var promises = [];
    promises.push(query1(date));
    promises.push(query2());

    var results = await Promise.all(promises);
    console.log(results[0]); // query1
    console.log(results[1]); // query2

    function query1(date) {
        return new Promise((resolve, reject) => {
            res.locals.connection.query('SELECT * FROM job WHERE date = ?',[date] , function (error, results, fields) {
                if (error) {
                    reject(error);
                } else {
                    resolve(results);
                }
            });
        });
    }

    function query2() {
        return new Promise((resolve, reject) => {
            res.locals.connection.query('SELECT * FROM vehicle' , function (error, results, fields) {
                if (error) {
                    reject(error);
                } else {
                    resolve(results);
                }
            });
        });
    }

    var exec = require('child_process').exec, child;
child = exec('java -jar /home/java/testsize.jar',
  function (error, stdout, stderr){
    console.log('stdout: ' + JSON.stringify(stdout));
    //console.log('stderr: ' + stderr);
    res.send(joblist+"  "+stderr);
    if(error !== null){
      console.log('exec error: ' + error);
    }
});

});

module.exports = router;

1 Ответ

1 голос
/ 02 мая 2019

Я предполагаю, что файл jar не содержит аргументов командной строки.

Синтаксис для передачи аргументов командной строки в Java: java -jar javafilename arg1 arg2 ....

чтобы передать аргументы командной строки в вашем коде:

/*variable 'store the results of two array in string'*/
const cmdArgs = [...results[0], results[1]].toString().replace(/[, ]+/g, " ");
/* variable 'command line code' */
const cmdCode = `java -jar /home/java/testsize.jar ${cmdArgs}`;
 var exec = require('child_process').exec, child;
child = exec(cmdCode,
  function (error, stdout, stderr){
    console.log('stdout: ' + JSON.stringify(stdout));
    //console.log('stderr: ' + stderr);
    res.send(joblist+"  "+stderr);
    if(error !== null){
      console.log('exec error: ' + error);
    }
});

Если файл JAR принимает результаты в качестве входных данных, вы можете просто передать их по каналу '|'.

Пример:

/*variable 'store the results to two array in string'*/
const cmdArgs = [...results[0], results[1]].toString().replace(/[, ]+/g, " ");
/* variable 'command line code' */
const cmdCode = `${cmdArgs} | java -jar /home/java/testsize.jar `;
 var exec = require('child_process').exec, child;
child = exec(cmdCode,
  function (error, stdout, stderr){
    console.log('stdout: ' + JSON.stringify(stdout));
    //console.log('stderr: ' + stderr);
    res.send(joblist+"  "+stderr);
    if(error !== null){
      console.log('exec error: ' + error);
    }
});

Что касается ограничения размера аргумента для аргумента .

Ничего не нашел об этом, но в разных ОС максимальная длина командной строки ограничена.

Если размер аргументов достаточно велик, чтобы превысить ограничение длины командной строки, вы можете перейти к входному потоку java, чтобы принять данные в качестве входных данных (необходимо изменить код java (jar file) для этого кода принять ввод данных).

Вы можете сохранить результат во временном файле, а затем передать его в JAR-канал через трубу.

Пример:

/*require fs to write into file*/
var fs = require("fs");

/*variable 'store the results to two array in string'*/
const cmdArgs = [...results[0], results[1]].toString().replace(/[, ]+/g, " ");
/*set file name*/
const tempFile = 'temp' + new Date().valueOf() + '.txt';
fs.writeFileSync(tempFile, cmdArgs);
/* variable 'command line code' */
const cmdCode = `cat > ${tempFile} | java -jar /home/java/testsize.jar `;
 var exec = require('child_process').exec, child;
child = exec(cmdCode,
  function (error, stdout, stderr){
    /*delete the file*/
    fs.unlinkSync(tempFile);
    console.log('stdout: ' + JSON.stringify(stdout));
    //console.log('stderr: ' + stderr);
    res.send(joblist+"  "+stderr);
    if(error !== null){
      console.log('exec error: ' + error);
    }
});
...