I feel like Spring itself should have a good answer to this question (in the form of documentation, at the least, or a retry interceptor of some sort). Alas, it does not.
Probably the best way to handle retries (if you want to continue being "declarative" about things) is to write your own interceptor implementation that will automatically retry the transaction a configured number of times. For starters, study Spring's TransactionInterceptor
, which manages begin/rollback/commit behavior for declarative transactions. If you're using Hibernate, note how it handles Hibernate session binding/unbinding to the current Thread.
Things to watch out for if you're using Hibernate:
session.clear()
is not sufficient.)MethodInterceptor.invoke()
-- the MethodInvocation
instance that gets passed in to this may be stateful; you may need to clone it before using it in the interceptor.I recommend using the class org.springframework.retry.interceptor.RetryOperationsInterceptor
from the spring retry project, configured like this:
<aop:config>
<aop:pointcut id="transactional" expression="execution(* com...*Service.remoteCall(..))" />
<aop:advisor pointcut-ref="transactional" advice-ref="retryAdvice" order="-1"/>
</aop:config>
<bean id="retryAdvice" class="org.springframework.retry.interceptor.RetryOperationsInterceptor"/>
But if you still want to implement it by yourself, the example of AOP from spring documentation is a good start.
There is no universal answer because it depends on application specifics. For example you may want to perform automatic transacted operation restart or notify the user about operation failure and ask for explicit retry confirmation etc.
I'd use AOP in case of automatic restart scenario.
I had the same question several years ago and ended up writing my own solution as an AOP aspect, which ends up looking like this in your code:
@RetryTransaction
@Transactional
public void doSomething() {
....
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With