次のコードは再試行していません。何が欠けていますか?
@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);
}
以下を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>
また、@ Retryableにさまざまな引数の組み合わせを指定してみました。
@Retryable(maxAttempts=10,value=Exception.class,backoff=@Backoff(delay = 2000,multiplier=2))
ありがとう。
スプリングブート2.0.2リリースで、同じクラスに再試行可能で呼び出されたメソッドがある場合、@ Retryableが機能しないことがわかりました。デバッグ時にポイントカットが正しく構築されていないことがわかりました。今のところ、この問題の回避策は、メソッドを別のクラスに記述して呼び出す必要があることです。
動作例は here で見つかります。
メソッドの@Retryable
アノテーションを検出するには、初期化されたコンテキストから正しく呼び出す必要があります。このメソッドは、SpringコンテキストのBeanから呼び出されたものですか、それとも他の方法で呼び出されたものですか?
テストする場合、これはSpringJunit4ClassRunner
?を使用するランナーです。
解決しました。再試行しようとしているメソッドから何かを返す場合、@ Retryable()が機能しないことがわかりました。
pom.xmlのmaven依存関係
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.1.5.RELEASE</version>
</dependency>
Spring boot Application.Java
@SpringBootApplication
@EnableTransactionManagement
@EnableRetry
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
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);
}
}
in 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();
}
}
出力:9回試行してから例外をスローします。
戻り値の型でも機能します
@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";
}
}
元の質問で説明したのとまったく同じ問題がありました。
私の場合、spring-boot-starter-aop
依存関係が誤って含まれていないことがわかりました。私のpom.xml
に追加した後、私の@Retryable
メソッドは期待どおりに機能しました。
@Retryable
メソッドから値を返すことは、私にとってはうまく機能します。
代替は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;
}
そして
retryTemplate.execute(new RetryCallback<Void, RuntimeException>() {
@Override
public Void doWithRetry(RetryContext arg0) {
myService.templateRetryService();
...
}
});
私のためにうまくいきました