I am using Spring RetryTemplate and using this method. Wanted to pass some argument (vendor) it is giving me compilation error. I can create a another variable vendorName as final can send it. But I want to make use the the variable vendor
. It must be simple one but not getting it. please help.
public Token getToken(final String tokenId) {
String vendor = getVendor(tokenId);//returns some vendor name
RetryTemplate retryTemplate = getRetryTemplate();
Token token = retryTemplate.execute(context -> {
logger.info("Attempted {} times", context.getRetryCount());
return retrieveToken(tokenId, vendor);
});
}
private RetryTemplate getRetryTemplate() {
final FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
fixedBackOffPolicy.setBackOffPeriod(getRandomNumber() * 1000);
final SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(5);
final RetryTemplate retryTemplate = new RetryTemplate();
retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
retryTemplate.setRetryPolicy(retryPolicy);
return retryTemplate;
}
compilation error is: Local variable vendor defined in an enclosing scope must be final or effectively final
You cannot use non-final variables in a lambda.
One option is to set
vendor
to finalAlternatively, you can refactor to just use a for loop instead.