Derzeit versuche ich, mein Skript auf einem Tomcat-Server mithilfe der grundlegenden Web-Container-Richtlinien für Spring-Batch-Boot aus der Dokumentation https://docs.spring.io/spring-batch/reference/html/configureJob.html ausführen Das Skript funktionierte ordnungsgemäß als JAR-Datei vor Änderungen an der Hauptklasse aber Wenn ich versuche, es in ein Servlet umzuwandeln, habe ich Probleme mit meinem Start nur beim Serverstart. Dieser Code setzt application.properties zu spring.batch.job.enabled=false
und verfügt über einen Controller vonWie bekomme ich @Postconstruct mit Spring Batch im Web Container?
@Controller
public class JobLauncherController {
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@RequestMapping("/jobLauncher.html")
public void handle() throws Exception{
jobLauncher.run(job, new JobParameters());
}
mit der Hauptanwendung das Servlet für tomcat als
@SpringBootApplication
@EnableBatchProcessing
public class BatchApplication extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(BatchApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(BatchApplication.class, args);
}
Das Problem zu starten, ist, dass meine Arbeit verwendet benutzerdefinierten Artikel Leser und Schreiber Das initialisiert es, bevor es mit ausgeführt wird. Es startet die @ PostConstruct beim Serverstart, was hilft, die Beans zum Schreiben zu initialisieren. Mein Artikel Leser/Schreiber so aussehen
public class CustomReader extends ItemStreamSupport implements ItemReader<Acct>, ResourceAwareItemReaderItemStream<Acct> {
//basic autowiring
private int nextAcctIndex;
private List<Acct> acctsList = new ArrayList();
@PostConstruct
private void initialize() throws IOException {
//logic to parse files
acctsList = Collections.unmodifiableList(acctsList);
nextAcctIndex = 0;
}
@Override
public Acct read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
// System.out.println("Start Read");
Acct nextAcct = null;
if (nextAcctIndex < acctsList.size()) {
nextAcct = acctsList.get(nextAcctIndex);
nextAcctIndex++;
//System.out.println(nextAcct);
}
Die BatchConfiguration nennt alles wie die meisten Beispiele, wie
@Bean public IteamReader<Acct> CustomReader(){ return new CustomReader();}
Meine Frage ist, bin ich über diese gehen in die falsche Richtung, oder gibt es eine Möglichkeit, es zu machen, also kann der nur aufgerufen werden, wenn der Controller es verlangt?
Ihr Leser/Schreiber mit diesem sollte Schritt oder Job sein. Anscheinend erstellst du sie als Singletons. Aber warum machst du das in einer @ PostConstruct-Methode? Es gibt keine solche Notwendigkeit ... –
Was versuchst du mit '@ PostConstruct' zu tun? Warum sollte man es gegen die regulären Frühlingsnotizen verwenden? –
Das war es. Ich bin neu im Frühling und war mir nicht sicher, was genau ich zu fragen versuchte, aber StepExecutionListener war perfekt mit BeforeStep und AfterStep –