2012-12-04 3 views
2

스프링 배치에 초보자입니다. 여러 스레드를 사용하여 봄부터 작업을 생성하고 성공적으로 실행했으며 프로그램 실행이 완료되면 프로그램 흐름이 끝나거나 중단되지 않는다는 점을 제외하고는 완벽하게 작동합니다. 즉, main 메소드의 마지막 문장이 실행되면 프로그램이 종료되지 않습니다. 스레드가 완료 될 때까지 대기하는지 여부는 확실하지 않습니다. 누군가 이것에 조언을 해줄 수 있습니까? 이 작업에 대해 한 번 "안녕하세요"다음은 위에서 언급 한 바와 같이 런처 코드주 스레드 실행 후 반환되지 않는 스프링 배치 스레드

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

작업 아래

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

그리고 내 config 파일입니다, 코드는 작업에 대한 5 가지 스레드에서 실행 "및 이 실행됩니다 심지어 "실행의 끝"main 메소드의 마지막 행 다음에 중단 메인 프로그램의 실행을 가져 오지 않지만 "세계". 모든 링크 백서 크게 appriciated됩니다 . 사전에 감사 사미르

+0

중간에 '의심스러운 Thread.sleep (5000)'이 있습니다. 왜 그렇게해야할까요? 런처의 작업 실행을 차단하면 안됩니다. 다른 주석 : 작업 실행 프로그램의 반환 값은 JobExecution이므로 JobRepository에서 다시 가져올 필요가 없습니다. –

답변

1

스레드 풀이 종료되고 있지 않습니다. 아마도 가장 좋은 방법은 응용 프로그램 컨텍스트 (finally 블록에서 안전)에서 close()를 호출하는 것입니다.

+0

안녕 데이브, 정말 고마워요. 비록 여기에 내 threadpool 봄에 의해 관리됩니다. 나는 그걸 처리하지 못한다. 공장을 통해 액세스 한 다음 닫으시겠습니까? – user1845926

+0

또한 응용 프로그램 컨텍스트 자체를 닫으면 작업 실행이 끝난 후에 추가 작업을 수행 할 수 없습니다. 일단 작업의 실행이 완료되면 단일 스레드에서 일부 코드를 실행할 수 있기를 원합니다. – user1845926

+0

더 많은 코드를 실행하는 데 방해가되는 부분이 있다고 생각하지 않습니까? 완료되면 컨텍스트를 닫으십시오. –