2017-07-28 14 views
0

現在、ドキュメンテーションのspring-batch-bootの基本Webコンテナガイドラインを使用してTomcatサーバー上でスクリプトを実行しようとしています メインクラスを変更する前にjarファイルとしてスクリプトが正しく動作していましたが、サーブレットに変換しようとすると、サーバーの起動時にのみ起動する@PostConstructに関する問題が発生しています。このコードは、spring.batch.job.enabled=falseにapplication.propertiesを設定し、WebコンテナのSpringバッチを使用して@Postconstructを取得する方法は?

@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); 

} 

としてTomcatのサーブレットを開始するには、メインアプリケーションと

@Controller 
public class JobLauncherController { 
    @Autowired 
    JobLauncher jobLauncher; 

    @Autowired 
    Job job; 

    @RequestMapping("/jobLauncher.html") 
    public void handle() throws Exception{ 
     jobLauncher.run(job, new JobParameters()); 
} 

のコントローラを持っている問題は、私の仕事は、カスタム・アイテム・リーダーとライターを使用していることです@PostConstructを使用して実行する前に初期化します。サーバーの起動時に@PostConstructを実行します。これは、Beanの書き込みを初期化するのに役立ちます。 マイアイテムリーダー/ライターはBatchConfigurationは、私の質問は、私はこのことについて間違った道を進んでいれるか、またはそれを作るための方法がある
@Bean public IteamReader<Acct> CustomReader(){ return new CustomReader();}

としてほとんどの例のようにすべてを呼び出し、この

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); 
     } 

のように見えます@PostConstructはコントローラが要求したときにのみ呼び出すことができますか?あなたは

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

@PostConstructを使用する必要が

+0

この場合、リーダー/ライターはステップまたはジョブスコープにする必要があります。どうやらあなたはシングルトンとしてそれらを作成します。しかし、なぜあなたは '@ PostConstruct'メソッドでそれをやっていますか?そのような必要はありません... –

+0

'@ PostConstruct'で何をしようとしていますか?なぜこれを通常の春の注釈と比較して使用するのですか? –

+0

それはそれでした。私は春に新しく、正確に何を求めようとしていたのか分からなかったが、StepExecutionListenerはBeforeStepとAfterStepで完璧だった –

答えて

0

applicationContextがロードされた後、一度初期化するために使用されます。 ジョブが実行されるたびにこの初期化を実行する必要があります(異なるジョブ間でデータが流出しないようにしたいのですが)。

関連する問題