2017-07-28 1 views
0

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?

+0

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 ... –

+0

Was versuchst du mit '@ PostConstruct' zu tun? Warum sollte man es gegen die regulären Frühlingsnotizen verwenden? –

+0

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 –

Antwort

0

müssen Sie

@BeforeStep 
public void beforeStep(StepExecution stepExecution) { 
    init(); 
} 

@PostConstruct verwendet verwenden ist, einmal zu initialisieren, nachdem applicationContext geladen wird. In Ihrem Fall möchten Sie diese Initialisierung jedes Mal ausführen, wenn der Job ausgeführt wird (Sie möchten nicht, dass Daten über verschiedene Jobs verteilt werden, richtig?)

Verwandte Themen