JAR не дает вывод в командной строке, но работает нормально в Eclipse - PullRequest
0 голосов
/ 16 мая 2019

Я сделал один планировщик для планирования какой-то задачи

public class CronTriggerApp {
@SuppressWarnings("rawtypes")
public static void main(String[] args) throws Exception {

    System.out.println("****************************************************************************");
    System.out.println("*                                                                          *");
    System.out.println("* Note : Please Place Jar and Properties file in same Folder               *");
    System.out.println("*                                                                          *");
    System.out.println("****************************************************************************");

    Properties cronProp = Utility.getPropFileData();

    Set set = cronProp.entrySet();
    Iterator itr = set.iterator();
    while (itr.hasNext()) {
        Map.Entry entry = (Map.Entry) itr.next();
        String propKey = (String)entry.getKey();
        String propValue = (String)entry.getValue();
        String timeArr[] = propValue.split(":");
        String seconds = timeArr[2];
        String minuts = timeArr[1];
        String hour = timeArr[0];

        String cronExp = seconds.trim()+" "+minuts.trim()+" "+hour.trim()+" "+"? "+ "* "+ "MON-FRI";
        System.out.println("Is Valid Time Declaration: "+CronExpression.isValidExpression(cronExp));
        if(CronExpression.isValidExpression(cronExp)) {
            JobDataMap map = new JobDataMap();
            map.put("TAG", propKey);

            JobKey jobKey = new JobKey("jobObj"+propKey, "group"+propKey);
            JobDetail jobObj = JobBuilder.newJob(ScheduleTask.class).withIdentity(jobKey).setJobData(map).build();

            //CRON_SCHEDULE = 0 46 11,12 ? * MON-FRI
            Trigger trigger =   TriggerBuilder.newTrigger().withIdentity("TriggerName"+propKey, "group"+propKey)
                                .withSchedule(CronScheduleBuilder.cronSchedule(cronExp)).build();

            Scheduler scheduler = new StdSchedulerFactory().getScheduler();

            scheduler.start();
            scheduler.scheduleJob(jobObj, trigger);

        }else {
            System.out.println("Please Provide Time in HOUR:MINUTS:SECONDS[(0-23):(1-59):(1-59)] Formate for "+propKey);
        }

    }


}

когда триггер выполнения ниже класса будет вызываться

  public class ScheduleTask implements Job {


    @SuppressWarnings("static-access")
    public void execute(JobExecutionContext arg) throws JobExecutionException{

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        LocalDateTime now = LocalDateTime.now();
        System.out.println("Today's Date time : "+dtf.format(now));

        OutputStream stdin = null;  
        BufferedReader stdError = null;
        BufferedReader stdInput = null;

        JobDataMap jobDataObj = arg.getMergedJobDataMap();
        String tag = (String)jobDataObj.get("TAG");
        System.out.println(tag);

        //"OB" "Opening  Bell" "Sensex:45,778,Nifty:75,888"
        String headerAndmessage = SchedulerDto.pshNotification(tag);
        String argumentParam = tag+" "+headerAndmessage;

        Hashtable<String, String> hashTable = new Hashtable<String, String> ();
        hashTable.put("REQDATA",headerAndmessage);
        hashTable.put("ACTION","I");
        String uniqueId = SchedulerDto.reqRespLog(hashTable);


        File file = new File("");
        String filepath = file.getAbsolutePath()+file.separator+"IVLGenericAlerts.jar";
        String cmdwithArg =" java -jar " +filepath+" "+argumentParam ;
        System.out.println("command and jar path detail with database response: "+cmdwithArg);
        try {
            // suppose cmdWithArg  is java -jar D:\\user_workspace\\IVLGenericAlerts.jar 
            **Process process = Runtime.getRuntime().exec(cmdwithArg);**

            stdin = process.getOutputStream ();  

            stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));


            System.out.println("Here is the standard output of the command:");
            String lastLine = null;
            String currentLine = null;
            System.out.println("is output" + (currentLine = stdInput.readLine()) != null);
            while ((currentLine = stdInput.readLine()) != null) {
                lastLine = currentLine;
                System.out.println("abc");
                System.out.println(currentLine);
            }
            System.out.println("before xml");
            String xmlToJson = "<?xml version=\"1.0\" ?>"+lastLine;
            JSONObject xmlJSONObj = XML.toJSONObject(xmlToJson);
            String jsonPrettyPrintString = xmlJSONObj.toString();

            JSONObject jsonObject = new JSONObject(jsonPrettyPrintString);
            System.out.println(jsonObject);
            JSONObject enp = (JSONObject)jsonObject.get("Envelope");
            JSONObject Body = (JSONObject)enp.get("Body");
            JSONObject RESULT = (JSONObject)Body.get("RESULT");
            Object SUCCESS = RESULT.get("SUCCESS");
            Object RecipientId = RESULT.get("RecipientId");
            Object ORGANIZATION_ID = RESULT.get("SUCCESS");


            hashTable.put("ACTION","U");
            Map<String, String> hm = new HashMap<String, String>();
            hm.put("SUCCESS", SUCCESS.toString());
            hm.put("RecipientId", RecipientId.toString());
            hm.put("ORGANIZATION_ID", ORGANIZATION_ID.toString());
            hashTable.put("RESPDATA",hm.toString());
            hashTable.put("UNIQUEID", uniqueId);
            SchedulerDto.reqRespLog(hashTable);

            //System.out.println(hashTable.toString());


            System.out.println("Here is the standard error of the command (if any):\n");
            System.out.println("in error");
            stdError = new BufferedReader(new  InputStreamReader(process.getErrorStream()));
            while ((currentLine = stdError.readLine()) != null) {
                System.out.println(currentLine);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            try {
                stdin.close();
                stdError.close();
                stdInput.close();
            } catch (IOException e) {

                e.printStackTrace();
            }
        }

    }

}

Вы можете видеть чуть выше класса String переменную cmdWithArg. когда я запускаю его из eclipse, это выдаст вывод, но когда я сделаю jar из eclipse с другим назначением, это не даст никакого вывода, мы используем наш пользовательский jar для вывода IVLGenericAlerts.jar . надеюсь, вы понимаете

1 Ответ

0 голосов
/ 17 мая 2019

проблема решена, нам нужно просто поставить экранирующие двойные кавычки "", когда мы получаем доступ к папке в командной строке

...