2016-04-20 15 views
0

Unsere Organisation verwendet den Enterprise Scheduler Skybot, um Stapeljobs auszuführen. Wir haben kürzlich unsere erste Spring-Batch-App bereitgestellt und unsere Jobs so geplant, dass sie unter der Nummer CommandLineJobRunner als Hauptklasse ausgeführt werden (Hauptklasse ist im Manifest unseres Krams definiert). Der Befehl sieht wie folgt aus:Spring Batch CommandLineJobRunner hängt bei Ausführung durch den Enterprise Scheduler

java -Dspring.profiles.active=production -jar AppName.jar jobs/jobName.xml jobId 

Wenn manuell auf der Kommandozeile ausgeführt werden, die Arbeitsplätze perfekt laufen. Wenn derselbe Befehl vom Scheduler ausgeführt wird, hängt der Job sofort ohne Ausgabe in den skybot-Protokollen und keine Arbeit durch den Job. Wir haben mögliche Berechtigungsprobleme untersucht, aber keine existieren. Die Spring Batch-Dokumentation besagt, dass CommandLineJobRunner für den Zweck der Ausführung von geplanten Jobs aus der Shell verfügbar ist, aber alle unsere Jobs hängen sofort bei der Ausführung. Wie können wir das lösen?

Antwort

0

Dies scheint eine Inkompatibilität zwischen der CommandLineJobRunner-Klasse und Skybot zu sein. Nachdem ich entschieden hatte, die Spring-Batch-Klasse durch meine eigene zu ersetzen (Laden des Anwendungskontexts, Erstellen eines JobLauncher, etc.), schaute ich auf die source code for CommandLineJobRunner. Die Hauptmethode hat einen frühen Anruf zu System.in.available(); Wenn wir den Job ausführen, indem Sie den Befehl eingeben und die Eingabetaste drücken, kann die Standardeingabe den Zeilenvorschub über die Tastatur lesen. Skybot as stdin hingegen blockiert nicht sofort, aber es folgt kein Zeilenvorschub, daher wartet das Programm unendlich auf die Eingabe.

aus dem Hauptverfahren org.springframework.batch.core.launch.support.CommandLineJobRunner:

if (System.in.available() > 0) { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
    String line = " "; 
    while (line != null) { 
     if (!line.startsWith("#") && StringUtils.hasText(line)) { 
      if (logger.isDebugEnabled()) { 
       logger.debug("Stdin arg: " + line); 
      } 
      newargs.add(line); 
     } 
     line = reader.readLine(); 
    } 
} 

Unsere Auftragsparameter sind alle Argumente auf den Anfangsbefehl, so dass dieser Code war unnötig und problematisch. Die Lösung bestand darin, selbst zu rollen - sehr ähnlich wie bei CommandLineJobRunner, aber ohne Interaktion mit der Standardeingabe.

+0

Sie könnten auch Spring Boot verwenden, die den 'CommandLineJobRunner' nicht verwendet ... –

+0

@MichaelMinella, danke - ich muss mich darum kümmern. – Tap