I am trying to implement the annotations @RefreshScope and @Retryable in my code. I want them to work simultaneously but I am not sure if it is possible. Currently, @Retryable works as it is suppose to. If the method throws an exception, it will retry max:5 times with 6 second down-times. The problem: I need @Value property to be refreshed, and @RefreshScope should take care of this BUT a different method takes @Value property as an argument. So really, if methodB that has @Retryable fails, I need methodA that takes the @Value property to refresh. If not, methodB retries with the same incorrect values. You're probably confused so here is an example:
@RefreshScope
@Service
public class JMSTopicClient {
@Value("#{'${jms.newTopic.topic}'}")
private String newTopicDestination;
private static int COUNTER = 0;
public boolean methodA(String message, ConcurrentHashMap jmsHeaderDetails){
InitialContext ctx = new InitialContext(newTopicEnv);
ConnectionInfo conInfo = connectionInfo.get();
conInfo.topic = (javax.jms.Topic) ctx.lookup(destinationTopic);
//rest of the code is irrelevant.
}
Notice, ctx.lookup(destinationTopic) takes the value of destinationTopic. Ultimately, this is the method that needs to be refreshed in case the value is changed in config repo (if methodB fails/retries)
@Retryable(value = { Exception.class }, maxAttempts = 5, backoff = @Backoff(delay = 6000))
public boolean methodB(Document doc, ConcurrentHashMap jmsHeadersDetails) {
COUNTER++;
String xmlEventNotify = DocumentHelperFactory.get().convertDocumentToString(doc);
boolean result = methodA(xmlEventNotify, jmsHeadersDetails);
if(result == false) {
if(COUNTER<5) {
throw new RuntimeException();
} else {
COUNTER = 0;
return result;
}
} else {
return result;
}
}
Here, methodB is retrying, but it is retrying with the same incorrect values that methodA takes in. I need the whole process methodA-methodB to retry if methodB throws exception.
I'm confident there is a workaround but I cannot find any documentation where @RefreshScope and @Retryable work simultaneously.
Thank you in advance!