2012-12-04 25 views
2

我是spring批處理的新手。我通過使用多線程創建併成功執行了春季的作業,除了在程序執行完成時,程序流程不會結束/暫停之外,它的工作方式非常好。即使當main方法的最後一條語句被執行時,程序也不會退出。我不確定它是否繼續等待線程完成或者什麼。有人可以請這個建議嗎? 你好‘「下面是工作彈簧批處理線程執行完主線程後不返回

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
      <property name="corePoolSize" value="5" /> 
      <property name="maxPoolSize" value="5" /> 
</bean> 

<batch:job id="helloWorldJob" job-repository="jobRepository"> 
     <batch:step id="step0" next="step1"> 
       <batch:tasklet ref="hello" transaction-manager="transactionManager" task-executor="taskExecutor" /> 
     </batch:step>   
     <batch:step id="step1"> 
       <batch:tasklet ref="world" transaction-manager="transactionManager" /> 
     </batch:step> 
</batch:job> 

而且我下面的配置文件是啓動代碼

public static void main(String args[]) { 
     try { 
      new ClassPathXmlApplicationContext("simpleJob.xml"); 

      JobParametersBuilder builder = new JobParametersBuilder(); 
      builder.addString("Date", "12/02/2011"); 
      jobLauncher.run(job, builder.toJobParameters()); 

      JobExecution jobExecution = jobRepository.getLastJobExecution(job.getName(), builder.toJobParameters()); 

      System.out.println("\n\n"+jobExecution.toString()); 
      Thread.sleep(5000); 
      System.out.println("End of execution "); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

正如上面所說的,代碼在5個不同的線程任務運行’,一旦任務即使主程序的最後一行「執行結束」執行後,也不會使主程序的執行停止,但是「世界」不會導致主程序的執行停止 預先致謝 Samir

+0

我發現中間的'Thread.sleep(5000)'有點可疑。你爲什麼需要這樣做?不應該在啓動器中阻止作業執行。 另一種評論:作業啓動器的返回值是一個JobExecution,因此不需要從JobRepository中再次獲取它。 –

回答

1

您的線程池未被關閉。可能最好的方法是在應用程序上下文中調用close()(在finally塊中保證安全)。

+0

你好戴夫,非常感謝你對此進行調查。雖然在這裏我的線程池是由春天管理的。我沒有處理它。您是否建議通過工廠訪問它,然後關閉它? – user1845926

+0

而且,如果我關閉應用程序上下文本身,任務執行結束後我將無法執行任何其他工作。我希望能夠在任務執行完成後在單線程中運行一些代碼。 – user1845926

+0

我不認爲有什麼阻止你運行更多的代碼嗎?完成後請關閉上下文。 –

相關問題