2016-08-02 18 views
5

मैं एक स्प्रिंग बूट बैच अनुप्रयोग है शेड्यूल करने का तरीका:एक स्प्रिंग बूट बैच आवेदन

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

@SpringBootApplication 
public class LoadApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(LoadApplication.class, args); 
    } 
} 

एक @Configuration वर्ग भी @EnableBatchProcessing साथ एनोटेट में, मैं निम्नलिखित बैच कार्य सेम को परिभाषित किया है:

@Bean 
public Job loadJob(JobBuilderFactory jobs, Step stepLoadFile, Step stepArchiveFile) { 
    return jobs.get("loadJob") 
      .incrementer(new RunIdIncrementer()) 
      .start(stepLoadFile) 
      .next(stepArchiveFile) 
      .build(); 
} 

बैच जॉब का stepLoadFile एक सपाट फ़ाइल पढ़ता है (नीचे देखें) और डेटाबेस डेटा को डेटाबेस में लिखता है। stepArchiveFile फिर फ़ाइल को एक अलग निर्देशिका में ले जाता है।

आम तौर पर, किसी निर्दिष्ट समय पर नौकरी (मंगलवार - शनिवार) में नौकरी चलाने की आवश्यकता होती है। हालांकि, अगर फ्लैट फ़ाइल नहीं मिली है, तो नौकरी विफल हो जाती है और जब तक यह सफल नहीं हो जाती है या अधिकतम संख्या (उदाहरण के 5) प्रयासों को हिट नहीं किया जाता है तब तक हर 30 मिनट फिर से चालू करने की आवश्यकता होती है। एक बार फिर से सफल होने के बाद, नौकरी अगले सामान्य रन टाइम तक फिर से नहीं चलनी चाहिए। इसके अलावा, प्रणाली को आदर्श रूप से एक ही नौकरी के समवर्ती रनों को रोकना चाहिए। यह सब कैसे किया जा सकता है?

नोट: पुन: चालू करने की आवश्यकता नहीं है जहां पिछले नौकरी चलाने में असफल रहा। ऐसा इसलिए है क्योंकि खंड में फ़ाइल की वस्तुओं की संख्या से बड़ा सेट सेट किया गया है।

मैं में मेरी @Configuration वर्ग इस कोशिश की (नोट: मैं भी विन्यास और मुख्य वर्ग के लिए @EnableRetry जोड़ा):

@Bean 
public ItemReader<Test> reader(LineMapper<Test> lineMapper, ApplicationProperties properties) { 
    FlatFileItemReader<Test> flatFileItemReader = new FlatFileItemReader<Test>() { 
     @Override 
     @Retryable(value = {ItemStreamException.class}, maxAttempts=5) 
     public void open(ExecutionContext executionContext) throws ItemStreamException { 
      super.open(executionContext); 
     } 

     @Override 
     @Retryable(maxAttempts=5) 
     public Holding read() throws UnexpectedInputException, ParseException, Exception { 
      return super.read(); 
     } 

    }; 
    flatFileItemReader.setResource(new FileSystemResource(properties.getLoadFile())); 
    flatFileItemReader.setLineMapper(lineMapper); 
    return flatFileItemReader; 
} 

ItemStreamException फेंक दिया और आवेदन बाहर निकलता है पुन: प्रयास के बिना किया जाता है।

उत्तर

6

आप LoadApplication कक्षा में नीचे घटक जोड़कर निर्धारित कर सकते हैं

@Component 
@EnableScheduling 
class ScheduledTasks { 
@Autowired 
JobLauncher jobLauncher; 

@Autowired 
Job job; 

/**The pattern is a list of six single space-separated fields: 
* representing second, minute, hour, day, month, weekday. 
* Month and weekday names can be given as the first three letters of the English names. 
* Example patterns: 

    "0 0 * * * *" = the top of every hour of every day.* 
    "*\/10 * * * * *" = every ten seconds. Remove 2nd character, it is escape 
    "0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day. 
    "0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30 and 10 o'clock every day. 
    "0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays 
    "0 0 0 25 12 ?" = every Christmas Day at midnight 

*/ 
@Scheduled(cron = "0 0/30 * * * TUE-SAT") 
public void runJob() throws Exception { 
    jobLauncher.run(job, new JobParameters()); 
} 
} 

पुन: प्रयास चरणों में विफल रहा है के लिए आप काम कदम ही
<chunk reader="itemReader" writer="itemWriter" commit-interval="2" retry-limit="5"> <retryable-exception-classes> <include class="java.io.FileNotFoundException"/> </retryable-exception-classes> </chunk>

इसके अलावा

में यह कॉन्फ़िगर करने के लिए यदि आप वसंत बैच की दुकान हो सकता है स्मृति भंडारण की बजाय डिस्क पर मेटा-डेटा टेबल, वसंत बैच एक ही नौकरी फिर से नहीं चलाएगा।

+0

प्रतिक्रिया के लिए धन्यवाद। दुर्भाग्यवश हालांकि, मुझे नहीं लगता कि यह मुझे जो कुछ चाहिए उसे पूरा करता है। नौकरी को प्रति दिन केवल एक बार चलाने की आवश्यकता होती है। 'अनुसूचित 'में, आप इसे हर 30 मिनट चलते हैं। जब नौकरी की विफलता होती है, तो मुझे इसे हर 30 मिनट तक फिर से शुरू करने की आवश्यकता होती है। 'पुनः प्रयास-सीमा' के साथ, मुझे लगता है कि यह तुरंत 30 मिनट प्रतीक्षा करने के बजाय पुनः प्रयास करेगा। मुझे यह भी विश्वास है कि 'पुनः प्रयास-सीमा' नौकरी के स्तर की बजाय आइटम स्तर पर है। अगर मैं इनमें से किसी भी मुद्दे पर गलत हूं तो कृपया मुझे सही करें। – James

0

अपने चरण घोषणा में सशर्त प्रवाह का उपयोग करें।
<step id="readWrite"> <tasklet>(...)</tasklet> <next on="FAILED" to="scheduleNext" /> </step> <step id="scheduleNext"> <tasklet ref="schedulerTasklet"> </step> <bean id="schedulerTasklet" class="SchedulerTasklet"/>

और SchedulerTasklet अनुसूची अगले समय में:

public class SchedulerTasklet implements Tasklet { 
    @Autowired private TaskScheduler taskScheduler; 
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { 
     Runnable task = new Runnable() { 
      public void run() { 
       run your job here 
      } 
     }; 
     taskScheduler.schedule(task, delay); 
     return RepeatStatus.FINISHED; 
    } 
}