I would like do retry if I fail to connect to database.
My requirement is
- retry 5 times at most and sleep 5 second then retry again
- Sets the delay between retries (i.e. 5 seconds), exponentially backing off to the maxDelay (i.e. 120 seconds) and multiplying successive delays by the delayFactor (i.e. 2).
How-to
Here has the sample code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | package albert.practice.retry; import java.sql.Connection; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; import net.jodah.failsafe.Failsafe; import net.jodah.failsafe.RetryPolicy; @Slf4j public class RetryTest { private int count = 0; public static void main(String[] args) throws ConnectionException { new RetryTest().connectWithRetry(); } public Connection connectWithRetry() { // create a retry policy with 5 max retries and have 2 seconds delay among retries RetryPolicy retryPolicy = new RetryPolicy(); // create a retry policy and sets the delay 5 seconds between retries, exponentially backing off to the maxDelay 120 // seconds and multiplying successive delays by the delayFactor 2. retryPolicy.retryOn(ConnectionException.class).withMaxRetries(5).withBackoff(5, 120, TimeUnit.SECONDS, 2); // Using Fallbacks allow you to provide an alternative result for a failed execution. // In this example, it will retry again after 5 seconds. Connection conn = Failsafe.with(retryPolicy).withFallback(() -> retryIfFail()) .get(() -> connect()); return conn; } public void retryIfFail() throws InterruptedException { log.debug("GG at " + getCurrentTime()); Thread.sleep(5000); log.debug("retry....." + getCurrentTime()); connectWithRetry(); } public Connection connect() throws ConnectionException { log.debug(" time = " + getCurrentTime()); Connection conn = null; if (count < 9) { count++; throw new ConnectionException("connection fail!"); } else { log.debug("get connection successfuly..."); } return conn; } private String getCurrentTime() { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS"); return dateFormat.format(new Date()); } } |
Execution log:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [main] DEBUG albert.practice.retry.RetryTest - time = 2016/11/23 17:31:51.495 [main] DEBUG albert.practice.retry.RetryTest - time = 2016/11/23 17:32:01.509 [main] DEBUG albert.practice.retry.RetryTest - time = 2016/11/23 17:32:21.515 [main] DEBUG albert.practice.retry.RetryTest - time = 2016/11/23 17:33:01.498 [main] DEBUG albert.practice.retry.RetryTest - time = 2016/11/23 17:34:21.499 [main] DEBUG albert.practice.retry.RetryTest - time = 2016/11/23 17:36:21.539 [main] DEBUG albert.practice.retry.RetryTest - GG at 2016/11/23 17:36:21.539 [main] DEBUG albert.practice.retry.RetryTest - retry.....2016/11/23 17:36:26.545 [main] DEBUG albert.practice.retry.RetryTest - time = 2016/11/23 17:36:26.545 [main] DEBUG albert.practice.retry.RetryTest - time = 2016/11/23 17:36:36.554 [main] DEBUG albert.practice.retry.RetryTest - time = 2016/11/23 17:36:56.564 [main] DEBUG albert.practice.retry.RetryTest - time = 2016/11/23 17:37:36.571 [main] DEBUG albert.practice.retry.RetryTest - get connection successfuly... |
No comments:
Post a Comment