Spring Batch的入门实例请参考我的另一篇文章:
http://blog.csdn.net/limiteewaltwo/article/details/8832771
把log4j的输出级别定义为info级别。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%p [%c] - %m%n" /> </layout> <!--过滤器设置输出的级别 --> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="levelMin" value="DEBUG" /> <param name="levelMax" value="ERROR" /> </filter> </appender> <!-- 根logger的设置 --> <root> <priority value="INFO" /> <appender-ref ref="CONSOLE"/> </root> </log4j:configuration>
/** * */ package com.test.springbatch; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; import org.springframework.batch.retry.RetryCallback; import org.springframework.batch.retry.RetryContext; import org.springframework.batch.retry.policy.SimpleRetryPolicy; import org.springframework.batch.retry.support.RetryTemplate; /** * @author hadoop * */ public class RetryTest { private static Logger logger = Logger.getLogger(RetryTest.class); /** * @param args */ public static void main(String[] args) { /** * SimpleRetryPolicy策略,重试固定的次数,包括第一次执行; */ SimpleRetryPolicy policy = new SimpleRetryPolicy(); /** * 最多尝试次数,第一次的序号为0,5表示共尝试5次(包括原始的第一次执行)。 */ policy.setMaxAttempts(5); Map<Class<? extends Throwable>,Boolean> retryExceptionMap = new HashMap<Class<? extends Throwable>,Boolean>(); /** * 设置发生哪些异常时,重试 */ retryExceptionMap.put(Exception.class, true); policy.setRetryableExceptions(retryExceptionMap); RetryTemplate template = new RetryTemplate(); template.setRetryPolicy(policy); boolean runResult = false; try { runResult = template.execute(new RetryCallback<Boolean>(){ private int count = 0; public Boolean doWithRetry(RetryContext context) throws Exception { count++; if(count < 5) { logger.info("exception happen" + count); throw new Exception("exception happen" + count); } logger.info("here" + count); return true; } }); } catch (Exception e) { e.printStackTrace(); } if(runResult) { logger.info("成功"); } else { logger.info("失败"); } } }
INFO [com.test.springbatch.RetryTest] - exception happen1 INFO [com.test.springbatch.RetryTest] - exception happen2 INFO [com.test.springbatch.RetryTest] - exception happen3 INFO [com.test.springbatch.RetryTest] - exception happen4 INFO [com.test.springbatch.RetryTest] - here5 INFO [com.test.springbatch.RetryTest] - 成功
如果把重试次数改为4,会发生什么呢。
policy.setMaxAttempts(4);执行结果如下:
INFO [com.test.springbatch.RetryTest] - exception happen1 INFO [com.test.springbatch.RetryTest] - exception happen2 INFO [com.test.springbatch.RetryTest] - exception happen3 INFO [com.test.springbatch.RetryTest] - exception happen4 java.lang.Exception: exception happen4 at com.test.springbatch.RetryTest$1.doWithRetry(RetryTest.java:55) at com.test.springbatch.RetryTest$1.doWithRetry(RetryTest.java:1) at org.springframework.batch.retry.support.RetryTemplate.doExecute(RetryTemplate.java:240) at org.springframework.batch.retry.support.RetryTemplate.execute(RetryTemplate.java:147) at com.test.springbatch.RetryTest.main(RetryTest.java:46) INFO [com.test.springbatch.RetryTest] - 失败
代码级的重试给了我们很高的灵活度,把某些比较容易出错的代码放入其中,能很好的增强我们代码的健壮性。