Spring Batch代码块级别的重试

Spring Batch的入门实例请参考我的另一篇文章:

http://blog.csdn.net/limiteewaltwo/article/details/8832771

把log4j的输出级别定义为info级别。





	
	
		
			
		
		
		
			
			
		
	
	
	
	
		
		
	

重试的代码示例:

/**
 * 
 */
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,Boolean> retryExceptionMap = new HashMap,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(){
				
				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("失败");
		}
	}

}

设计的情形为,前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
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] - 失败

第4次发生了异常之后,马上就把异常抛给了我们自己定义的异常处理。

代码级的重试给了我们很高的灵活度,把某些比较容易出错的代码放入其中,能很好的增强我们代码的健壮性。

你可能感兴趣的:(spring,batch)