This RetryAspect class is an implementation of the retry mechanism in Java using Aspect-Oriented Programming (AOP). It
allows methods annotated with @Retryable to be executed multiple times in case of failure, with configurable retry
attempts and backoff delay.
- Retry Mechanism: Automatically retries a method execution if it fails, based on the configuration provided by
the
@Retryableannotation. - Configurable Attempts and Delay: Allows configuration of the maximum number of retry attempts and the delay between retries.
- Exception Handling: Only retries for specified exceptions, providing fine-grained control over which failures should trigger a retry.
To use the RetryAspect class, follow these steps:
Annotate the methods you want to be retryable with the @Retryable annotation.
public class MyService {
@Retryable(maxAttempts = 3, backoff = @Backoff(delay = 1000), include = {RuntimeException.class})
public void performTask() {
// Method implementation
}
}In this example, performTask will make up to 3 total attempts (1 initial + 2 retries) with a delay of 1000 milliseconds between retries,
but only if a RuntimeException is thrown.
Note: Methods should be idempotent as they may be executed multiple times.
The @Retryable annotation allows you to configure the retry behavior for a method. It has the following attributes:
- maxAttempts: The maximum number of retry attempts (default is 3).
- backoff: Specifies the backoff policy, including the delay between retries.
- include: The exceptions that should trigger a retry.
@Retryable(maxAttempts = 5, backoff = @Backoff(delay = 2000), include = {IOException.class})
public void unreliableMethod() {
// Method implementation
}In this example, unreliableMethod will make up to 5 total attempts (1 initial + 4 retries) with a delay of 2000 milliseconds between retries,
but only if an IOException is thrown.
- maxAttempts: Must be at least 1. Represents total attempts (initial + retries)
- include: Cannot be empty. Must specify at least one exception type to retry
- delay: Must be non-negative (in milliseconds)
- multiplier: Use values > 1.0 for exponential backoff, 1.0 for fixed delay
To use the RetryAspect library in your project, include the following dependencies and plugins in your pom.xml file:
- Add
retryaspectas a dependency
<dependencies>
...
<dependency>
<groupId>io.github.cmccarthyirl</groupId>
<artifactId>retryaspect</artifactId>
<version>1.0.5</version>
</dependency>
...
</dependencies>- Configure the AspectJ Maven Plugin
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.15.0</version>
<configuration>
<complianceLevel>16.0</complianceLevel>
<source>16.0</source>
<target>16.0</target>
<showWeaveInfo>true</showWeaveInfo>
<verbose>true</verbose>
<Xlint>ignore</Xlint>
<encoding>UTF-8</encoding>
<aspectLibraries>
<aspectLibrary>
<groupId>io.github.cmccarthyirl</groupId>
<artifactId>retryaspect</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<!-- use this goal to weave all your main classes -->
<goal>compile</goal>
<!-- use this goal to weave all your test classes -->
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>Contributions are welcome! Here's how you can get started!!
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.