Le code suivant ne réessaye pas. Qu'est-ce que je rate?
@EnableRetry
@SpringBootApplication
public class App implements CommandLineRunner
{
.........
.........
@Retryable()
ResponseEntity<String> authenticate(RestTemplate restTemplate, HttpEntity<MultiValueMap<String, String>> entity) throws Exception
{
System.out.println("try!");
throw new Exception();
//return restTemplate.exchange(auth_endpoint, HttpMethod.POST, entity, String.class);
}
J'ai ajouté ce qui suit au fichier pom.xml.
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
J'ai également essayé de fournir différentes combinaisons d'arguments à @Retryable.
@Retryable(maxAttempts=10,value=Exception.class,backoff=@Backoff(delay = 2000,multiplier=2))
Merci.
Pour que l'annotation @Retryable
de la méthode soit découverte, elle doit être appelée correctement à partir d'un contexte initialisé. La méthode est-elle invoquée à partir d'un haricot du contexte de printemps ou par d'autres moyens?
Si vous testez ceci, votre coureur utilise le SpringJunit4ClassRunner
?
Dans Spring Boot 2.0.2 Release, j’ai observé que le @Retryable ne fonctionnait pas si vous utilisiez la méthode retryable et appelée dans la même classe. Lors du débogage, on s’aperçoit que le pointcut n’est pas construit correctement. Pour le moment, la solution à ce problème consiste à écrire la méthode dans une classe différente et à l'appeler.
Vous pouvez trouver un exemple de travail ici .
Je l'ai résolu. J'ai compris que si retourner quelque chose de la méthode que vous essayez de réessayer, alors @Retryable () ne fonctionne pas.
dépendance maven dans pom.xml
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.1.5.RELEASE</version>
</dependency>
Application de démarrage à ressort.Java
@SpringBootApplication
@EnableTransactionManagement
@EnableRetry
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
dans controller.Java
@RestController
public class JavaAllDataTypeController {
@Autowired
JavaAllDataTypeService JavaAllDataTypeService;
@RequestMapping(
value = "/springReTryTest",
method = RequestMethod.GET
)
public ResponseEntity<String> springReTryTest() {
System.out.println("springReTryTest controller");
try {
JavaAllDataTypeService.springReTryTest();
} catch (Exception e) {
e.printStackTrace();
}
return new ResponseEntity<String>("abcd", HttpStatus.OK);
}
}
en service.Java
@Service
@Transactional
public class JavaAllDataTypeService {
// try the method 9 times with 2 seconds delay.
@Retryable(maxAttempts=9,value=Exception.class,backoff=@Backoff(delay = 2000))
public void springReTryTest() throws Exception {
System.out.println("try!");
throw new Exception();
}
}
sortie: Il essaie 9 fois puis jette exception.
Cela fonctionne aussi pour le type de retour
@Service
public class RetryService {
private int count = 0;
// try the method 9 times with 2 seconds delay.
@Retryable(maxAttempts = 9, value = Exception.class, backoff = @Backoff(delay = 2000))
public String springReTryTest() throws Exception {
count++;
System.out.println("try!");
if (count < 4)
throw new Exception();
else
return "bla";
}
}
Une alternative pourrait être RetryTemplate
@Bean
public RetryTemplate retryTemplate() {
RetryTemplate retryTemplate = new RetryTemplate();
FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
fixedBackOffPolicy.setBackOffPeriod(2000l);
retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(2);
retryTemplate.setRetryPolicy(retryPolicy);
return retryTemplate;
}
et
retryTemplate.execute(new RetryCallback<Void, RuntimeException>() {
@Override
public Void doWithRetry(RetryContext arg0) {
myService.templateRetryService();
...
}
});
travaillé pour moi