Dans l'application Spring Boot, je définis certaines propriétés de configuration dans le fichier yaml comme ci-dessous.
my.app.maxAttempts = 10
my.app.backOffDelay = 500L
Et un exemple de haricot
@ConfigurationProperties(prefix = "my.app")
public class ConfigProperties {
private int maxAttempts;
private long backOffDelay;
public int getMaxAttempts() {
return maxAttempts;
}
public void setMaxAttempts(int maxAttempts) {
this.maxAttempts = maxAttempts;
}
public void setBackOffDelay(long backOffDelay) {
this.backOffDelay = backOffDelay;
}
public long getBackOffDelay() {
return backOffDelay;
}
Comment puis-je injecter les valeurs de my.app.maxAttempts
et my.app.backOffdelay
à l'annotation Spring Retry? Dans l'exemple ci-dessous, je souhaite remplacer la valeur 10
de maxAttempts et 500L
of valeur d'interruption avec les références correspondantes des propriétés de configuration.
@Retryable(maxAttempts=10, include=TimeoutException.class, backoff=@Backoff(value = 500L))
À partir de spring-retry-1.2. nous pouvons utiliser des propriétés configurables dans l'annotation @Retryable.
Utilisez "maxAttemptsExpression", reportez-vous au code ci-dessous pour l'utilisation,
@Retryable(maxAttemptsExpression = "#{${my.app.maxAttempts}}",
backoff = @Backoff(delayExpression = "#{${my.app. backOffDelay}}"))
Cela ne fonctionnera pas si vous utilisez une version inférieure à 1.2.0. De plus, vous n'avez pas besoin de classes de propriétés configurables.
Vous pouvez également utiliser des beans existants dans les attributs d'expression.
@Retryable(include = RuntimeException.class,
maxAttemptsExpression = "#{@retryProperties.getMaxAttempts()}",
backoff = @Backoff(delayExpression = "#{@retryProperties.getBackOffInitialInterval()}",
maxDelayExpression = "#{@retryProperties.getBackOffMaxInterval" + "()}",
multiplierExpression = "#{@retryProperties.getBackOffIntervalMultiplier()}"))
String perform();
@Recover
String recover(RuntimeException exception);
où
retryProperties
est votre bean qui détient les propriétés liées aux nouvelles tentatives comme dans votre cas.
Vous pouvez utiliser Spring EL comme indiqué ci-dessous pour charger les propriétés:
@Retryable(maxAttempts="${my.app.maxAttempts}",
include=TimeoutException.class,
backoff=@Backoff(value ="${my.app.backOffDelay}"))