2016-05-13 7 views
0

最近私は、Javaの設定方法を使用してSpringバッチとスターターパッケージを使用してSpringバッチプログラムを作成し始めました。パーティション化されたステップとタスクのエグゼキュータを使用して私の仕事をしました。私が直面している問題は、ジョブが完了したらバッチプロセスが止まらず、EclipseとLinuxボックスで実行し続けることです。私は手動で仕事を見つけて殺す。これで助けてくれますか? これは、分割されたステップなしで単一のスレッド方式でジョブを実行する場合に有効です。Spring Boot Springバッチ分割ジョブがCOMPLETION後に停止しない

私の仕事コンフィグ:

@Bean 
    @StepScope 
    public ItemReader<MediaAsset> metaDataExportReader(@Value("#{jobParameters[sourceSystemCode]}") String sourceSystemCode,@Value("#{jobParameters[assetType]}") String assetType,@Value("#{stepExecutionContext[startingMediaAssetId]}") long startingMediaAssetId, 
      @Value("#{stepExecutionContext[endingMediaAssetId]}") long endingMediaAssetId,@Value("#{stepExecutionContext[threadName]}") String threadName) throws Exception { 
     logger.debug("Reader is called...."+sourceSystemCode); 
     logger.debug("page size---------->"+jobConfig.getPageOrChunkSizeMetaDataExport()); 
     logger.debug("startingMediaAssetId---------->"+startingMediaAssetId); 
     logger.debug("endingMediaAssetId"+endingMediaAssetId); 
     logger.debug("threadName"+threadName); 
     final Map<String,Object> parameters = new HashMap<>(); 
     parameters.put("startingMediaAssetId",startingMediaAssetId); 
     parameters.put("endingMediaAssetId",endingMediaAssetId); 
     JdbcPagingItemReader<MediaAsset> jdbcPagingItemReader = getJdbcPagingItemReader(sourceSystemCode, assetType); 
     jdbcPagingItemReader.setParameterValues(parameters); 
     return jdbcPagingItemReader; 
    } 

    @Bean(destroyMethod="close") 
    @StepScope 
    public ItemWriter<MediaAsset> metaDataExportWriter(@Value("#{jobParameters[sourceSystemCode]}") String sourceSystemCode,@Value("#{jobParameters[assetType]}") String assetType,@Value("#{stepExecutionContext[startingMediaAssetId]}") long startingMediaAssetId, 
      @Value("#{stepExecutionContext[endingMediaAssetId]}") long endingMediaAssetId,@Value("#{stepExecutionContext[threadName]}") String threadName) throws Exception { 
     logger.debug("Coming here Item Writer,..."+threadName); 
     logger.debug("getItemsPerFile---------->"+jobConfig.getPageOrChunkSizeMetaDataExport()); 
     //for xml file creation 
     StaxEventItemWriter<MediaAsset> staxEventItemWriter = new StaxEventItemWriter<>(); 
     staxEventItemWriter.setRootTagName(DL3ConstantUtil.EXPORT_ASSET_METADATA_BY_SOURCESYSTEM_CODE_ROOT_TAG); 
     staxEventItemWriter.setMarshaller(marshaller); 
     staxEventItemWriter.setOverwriteOutput(true); 
     //for splitting the files into multiple files based on record size 
     MultiResourceItemWriter<MediaAsset> multiResourceItemWriter = new MultiResourceItemWriter<>(); 
     multiResourceItemWriter.setItemCountLimitPerResource(jobConfig.getPageOrChunkSizeMetaDataExport()); 
     multiResourceItemWriter.setDelegate(staxEventItemWriter); 
     multiResourceItemWriter.setResourceSuffixCreator(new ResourceSuffixCreator() { 
      @Override 
      public String getSuffix(int index) { 
       return DL3ConstantUtil.UNDERSCORE+threadName+DL3ConstantUtil.UNDERSCORE+startingMediaAssetId+DL3ConstantUtil.UNDERSCORE+endingMediaAssetId+DL3ConstantUtil.UNDERSCORE+index+DL3ConstantUtil.EXPORT_ASSET_METADATA_BY_SOURCESYSTEM_CODE_FILE_NAME_SUFFIX; 
      } 
     }); 
     logger.debug("writer sourceSystemCode"+sourceSystemCode); 
     switch (assetType) { 
     case DL3ConstantUtil.IMAGE_ASSET: 
      switch (sourceSystemCode) { 
      case DL3ConstantUtil.LIGHTBOX: 
       multiResourceItemWriter.setResource(new FileSystemResource(jobConfig.getTargetFileLocation()+jobConfig.getBackSlash()+"IA"+jobConfig.getBackSlash()+"DPL"+jobConfig.getBackSlash()+DL3ConstantUtil.EXPORT_ASSET_METADATA_BY_SOURCESYSTEM_CODE_LIGHT_BOX_FILE_NAME_PREFIX_NAME_IMG)); 
       break; 
      case DL3ConstantUtil.SOLAR: 
       multiResourceItemWriter.setResource(new FileSystemResource(jobConfig.getTargetFileLocation()+jobConfig.getBackSlash()+"IA"+jobConfig.getBackSlash()+"SOLAR"+jobConfig.getBackSlash()+DL3ConstantUtil.EXPORT_ASSET_METADATA_BY_SOURCESYSTEM_CODE_SOLAR_BOX_FILE_NAME_PREFIX_NAME_IMG)); 
       break; 
      case DL3ConstantUtil.MANUAL_UPLOAD: 
       multiResourceItemWriter.setResource(new FileSystemResource(jobConfig.getTargetFileLocation()+jobConfig.getBackSlash()+"IA"+jobConfig.getBackSlash()+"DDDS"+jobConfig.getBackSlash()+DL3ConstantUtil.EXPORT_ASSET_METADATA_BY_SOURCESYSTEM_CODE_DDDS_BOX_FILE_NAME_PREFIX_NAME_IMG)); 
       break; 
      default: 
       break; 
      } 
     break; 
     case DL3ConstantUtil.DOCUMENT_ASSET: 
      switch (sourceSystemCode) { 
      case DL3ConstantUtil.SOLAR: 
       multiResourceItemWriter.setResource(new FileSystemResource(jobConfig.getTargetFileLocation()+jobConfig.getBackSlash()+"DA"+jobConfig.getBackSlash()+"SOLAR"+jobConfig.getBackSlash()+DL3ConstantUtil.EXPORT_ASSET_METADATA_BY_SOURCESYSTEM_CODE_SOLAR_BOX_FILE_NAME_PREFIX_NAME_DOC)); 
       break; 
      case DL3ConstantUtil.MANUAL_UPLOAD: 
       multiResourceItemWriter.setResource(new FileSystemResource(jobConfig.getTargetFileLocation()+jobConfig.getBackSlash()+"DA"+jobConfig.getBackSlash()+"DDDS"+jobConfig.getBackSlash()+DL3ConstantUtil.EXPORT_ASSET_METADATA_BY_SOURCESYSTEM_CODE_DDDS_BOX_FILE_NAME_PREFIX_NAME_DOC)); 
       break; 
      default: 
       break; 
      } 
      break; 
     default: 
      throw new Exception("no matching assetType "); 
     } 
     return multiResourceItemWriter; 
    } 


    @Bean(name="GenerateXMLFilesMaster") 
    public Step generateXMLFilesMaster(ItemReader<MediaAsset> metaDataExportReader,ItemWriter<MediaAsset> metaDataExportWriter) { 
     logger.debug("Master Step initialization..."); 
     return stepBuilderFactory.get("GenerateXMLFilesMaster"). 
       partitioner(generateXMLFilesSlave(metaDataExportReader,metaDataExportWriter)). 
       partitioner("GenerateXMLFilesSlave",metaDataExportPartioner(null,null,null)). 
       partitionHandler(metaDataExportPartionHandler(metaDataExportReader,metaDataExportWriter)). 
       build(); 

    } 

    @Bean(name="GenerateXMLFilesSlave") 
    public Step generateXMLFilesSlave(ItemReader<MediaAsset> metaDataExportReader,ItemWriter<MediaAsset> metaDataExportWriter) { 
     return stepBuilderFactory.get("GenerateXMLFilesSlave") 
       .<MediaAsset, MediaAsset> chunk(jobConfig.getPageOrChunkSizeMetaDataExport()) 
       .reader(metaDataExportReader) 
       .writer(metaDataExportWriter) 
       .build(); 
    } 

    @Bean(name="uploadTaskletMetaData") 
    @StepScope 
    public Tasklet uploadTaskletMetaData(@Value("#{jobParameters[sourceSystemCode]}") String sourceSystemCode,@Value("#{jobParameters[assetType]}") String assetType){ 
     MetaDataUploadTasklet metaDataUploadTasklet = new MetaDataUploadTasklet(); 
     logger.debug("sourceSystemCode----->"+sourceSystemCode); 
     logger.debug("assetType----->"+assetType); 
     metaDataUploadTasklet.setTargetFolder(jobConfig.getTargetMetaDataRootPath()); 
     switch (assetType) { 
     case DL3ConstantUtil.IMAGE_ASSET: 
      switch (sourceSystemCode) { 
      case DL3ConstantUtil.LIGHTBOX: 
       metaDataUploadTasklet.setSourceDirectory(jobConfig.getTargetFileLocation()+jobConfig.getBackSlash()+"IA"+jobConfig.getBackSlash()+"DPL"+jobConfig.getBackSlash()); 
       //metaDataUploadTasklet.setTargetFolder(jobConfig.getTargetMetaDataRootPath()+"/IA/DPL"); 
       break; 
      case DL3ConstantUtil.SOLAR: 
       metaDataUploadTasklet.setSourceDirectory(jobConfig.getTargetFileLocation()+jobConfig.getBackSlash()+"IA"+jobConfig.getBackSlash()+"SOLAR"+jobConfig.getBackSlash()); 
       //metaDataUploadTasklet.setTargetFolder(jobConfig.getTargetMetaDataRootPath()+"/IA/SOLAR"); 
       break; 
      case DL3ConstantUtil.MANUAL_UPLOAD: 
       metaDataUploadTasklet.setSourceDirectory(jobConfig.getTargetFileLocation()+jobConfig.getBackSlash()+"IA"+jobConfig.getBackSlash()+"DDDS"+jobConfig.getBackSlash()); 
       //metaDataUploadTasklet.setTargetFolder(jobConfig.getTargetMetaDataRootPath()+"/IA/DDDS"); 
       break; 
      default: 
       break; 
      } 
      break; 
     case DL3ConstantUtil.DOCUMENT_ASSET: 
      switch (sourceSystemCode) { 
      case DL3ConstantUtil.SOLAR: 
       metaDataUploadTasklet.setSourceDirectory(jobConfig.getTargetFileLocation()+jobConfig.getBackSlash()+"DA"+jobConfig.getBackSlash()+"SOLAR"+jobConfig.getBackSlash()); 
       //metaDataUploadTasklet.setTargetFolder(jobConfig.getTargetMetaDataRootPath()+"/DA/SOLAR"); 
       break; 
      case DL3ConstantUtil.MANUAL_UPLOAD: 
       metaDataUploadTasklet.setSourceDirectory(jobConfig.getTargetFileLocation()+jobConfig.getBackSlash()+"DA"+jobConfig.getBackSlash()+"DDDS"+jobConfig.getBackSlash()); 
       //metaDataUploadTasklet.setTargetFolder(jobConfig.getTargetMetaDataRootPath()+"/DA/DDDS"); 
       break; 
      default: 
       break; 
      } 
      break; 
     default: 
      break; 
     } 


     return metaDataUploadTasklet; 
    } 

    @Bean(name="UploadXMLFiles") 
    public Step uploadXMLFiles(){ 
     return stepBuilderFactory.get("UploadXMLFiles").tasklet(uploadTaskletMetaData(null,null)).build(); 
    } 

    @Bean 
    @StepScope 
    public Partitioner metaDataExportPartioner(@Value("#{jobParameters[sourceSystemCode]}") String sourceSystemCode,@Value("#{jobParameters[assetType]}") String assetType,@Value("#{jobExecutionContext[totalCount]}") String totalCount){ 
     logger.debug("source system code--->"+sourceSystemCode); 
     logger.debug("assetType--->"+assetType); 
     MetaDataExportPartioner metaDataExportPartioner = new MetaDataExportPartioner(); 
     metaDataExportPartioner.setSourceSystemCode(sourceSystemCode); 
     metaDataExportPartioner.setAssetType(assetType); 
     logger.debug("In the partioner initiliazation------>"+totalCount); 
     metaDataExportPartioner.setTotalCount(StringUtils.isEmpty(totalCount)?0:Integer.parseInt(totalCount)); 
     return metaDataExportPartioner; 
    } 

    @Bean 
    public PartitionHandler metaDataExportPartionHandler(ItemReader<MediaAsset> reader,ItemWriter<MediaAsset> writer){ 
     logger.debug("Initializing partionHandler------>"); 
     TaskExecutorPartitionHandler partitionHandler = new TaskExecutorPartitionHandler(); 
     partitionHandler.setStep(generateXMLFilesSlave(reader,writer)); 
     partitionHandler.setGridSize(6); 
     partitionHandler.setTaskExecutor(taskExecutor()); 
     return partitionHandler; 
    } 

    @Bean 
    public TaskExecutor taskExecutor() { 
     ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); 
     taskExecutor.setMaxPoolSize(10); 
     taskExecutor.setCorePoolSize(10); 
     taskExecutor.afterPropertiesSet(); 
     return taskExecutor; 
    } 

    @Bean() 
    public JobExecutionListener metaDataExportJobExecutionListener(){ 
     JobExecutionListener jobExecutionListener = new MetaDataExportJobListener(); 
     return jobExecutionListener; 
    } 

    @Bean 
    public Job exportMetaDataJob(JobExecutionListener metaDataExportJobExecutionListener) throws Exception { 
     return jobBuilderFactory.get("ExportMetaDataJob") 
       .incrementer(new RunIdIncrementer()) 
       .listener(metaDataExportJobExecutionListener) 
       .flow(generateXMLFilesMaster(metaDataExportReader(null,null,0L,0L,null),metaDataExportWriter(null,null,0L,0L,null))) 
       //.next(uploadXMLFiles()) 
       .end() 
       .build(); 
    } 

マイポンポンファイルのエントリ:ランニングゼロ非デーモンスレッドがあるときに自動的にシャットダウン

<parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.3.2.RELEASE</version> 
     <relativePath /> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <java.version>1.8</java.version> 
     <spring-cloud-version>1.0.4.RELEASE</spring-cloud-version> 
     <spring-batch-admin.version>1.3.0.RELEASE</spring-batch-admin.version> 
    </properties> 

    <dependencies> 

     <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> 
      </dependency> --> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-batch</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-mail</artifactId> 
     </dependency> 

     <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-thymeleaf</artifactId> 
     <exclusions> 
     <exclusion> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </exclusion> 
    </exclusions> 
    </dependency> 

     <!-- <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-admin-manager</artifactId> 
      <version>${spring-batch-admin.version}</version> <exclusions> <exclusion> 
      <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> 
      <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> 
      </exclusion> </exclusions> </dependency> --> 

     <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-aws-context</artifactId> 
      <version>${spring-cloud-version}</version> 
     </dependency> 

     <dependency> 
      <groupId>com.microsoft.sqlserver</groupId> 
      <artifactId>sqljdbc4</artifactId> 
      <version>4.0</version> 
     </dependency> 

     <dependency> 
      <groupId>com.oracle</groupId> 
      <artifactId>ojdbc14</artifactId> 
      <version>10.2.0.3.0</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-oxm</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-devtools</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>commons-io</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>2.3</version> 
     </dependency> 

     <!-- <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-dbcp2</artifactId> 
      <version>2.0.1</version> 
     </dependency> --> 

     <!-- <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> 
      <version>2.0.1</version> </dependency> --> 

    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

答えて

0

のJVM。パーティション化されていない状況では、ジョブが完了したときに非デーモン・スレッドが実行されていないので、JVMはシャットダウンします。ただし、パーティション化されたユースケースでは、作業を待っているアプリケーションを停止させておく必要があります。スレッドダンプを実行すると、問題の診断に役立ちますが、ThreadPoolTaskExecutorによって保持されているスレッドが問題であることがわかります。そうであれば、スレッドプールを作成しないオプション(JVMがシャットダウンしないようにする)を見たいかもしれません。

+0

こんにちはマイケル。あなたのレスポンスを確認してください。私はあなたのビデオを見て、春のバッチコンセプトを学びました。私はjstackをして、何かを待っているスレッドが少ないことを発見しました。それのための。これを修正するには、ジョブが完了したらスレッドプールタスクエクゼキュータをシャットダウンし、問題を解決するjobexecution liseter afetrjobメソッドをシャットダウンします。デフォルトではすべてのスプリングを含むspring-starter-thymeleaf依存性を追加したため、私はthymeleafから除外しました。それは正しいアプローチですか? –

関連する問題