Java 在CompletionService中重试策略
我需要为通过ExecutorCompletionService调用API配置重试策略 示例代码:Java 在CompletionService中重试策略,java,asynchronous,executorservice,retrypolicy,completion-service,Java,Asynchronous,Executorservice,Retrypolicy,Completion Service,我需要为通过ExecutorCompletionService调用API配置重试策略 示例代码: public void func() throws Exception{ ExecutorService executorService = Executors.newFixedThreadPool(5); CompletionService<String> completionService = new ExecutorCompletionService<Stri
public void func() throws Exception{
ExecutorService executorService = Executors.newFixedThreadPool(5);
CompletionService<String> completionService = new ExecutorCompletionService<String>(executorService);
List<Future<String>> list = new ArrayList<Future<String>>();
for(int i=0; i<10; i++) {
AsyncTest asyncTest = new AsyncTest();
Future<String> futureString = completionService.submit(asyncTest);
list.add(futureString);
}
while (list.size() > 0) {
Future<String> futureResponse = completionService.take();
System.out.println(futureResponse.get());
list.remove(futureResponse);
}
executorService.shutdown();
}
public class AsyncTest implements Callable<String> {
public String call() throws Exception {
//returns a response from api call
//this is a network call and throws TimeoutException
}
}
public void func()引发异常{
ExecutorService ExecutorService=Executors.newFixedThreadPool(5);
CompletionService CompletionService=新的ExecutionCompletionService(ExecutionService);
列表=新的ArrayList();
对于(int i=0;i 0){
Future futureResponse=completionService.take();
System.out.println(futuresponse.get());
列表。删除(未来响应);
}
executorService.shutdown();
}
公共类AsyncTest实现可调用{
公共字符串调用()引发异常{
//从api调用返回响应
//这是一个网络调用并引发TimeoutException
}
}
调用API时抛出的TimeoutException的重试策略的最佳实现方式是什么?我增强了类异步测试:
public class RetryableAsyncTest implements Callable<RetryableAsyncTest> {
private final String _name;
private /* */ String _value;
private /* */ boolean _timeouted;
private /* */ int _retryCount;
public RetryableAsyncTest( String name ) {
_name = name;
}
@Override
public RetryableAsyncTest call() throws Exception {
try {
++_retryCount;
_timeouted = false;
//-------- Begin of functionnal code
if( Math.random() > 0.5 ) { // Simulation of
throw new TimeoutException(); // timeout condition
}
_value = "computation result";
//-------- End of functionnal code
}
catch( final TimeoutException x ) {
_timeouted = true;
}
return this;
}
public String getName() {
return _name;
}
public String getValue() {
return _value;
}
public boolean isTimeouted() {
return _timeouted;
}
public int getRetryCount() {
return _retryCount;
}
}
如果您想接收重试次数,此逻辑将在
retryableasynceducer.get()
方法中执行,作为公司提交(任务)的If-then-else条件代码>在我回答之前,先做一点澄清,以确保我知道到底发生了什么。TimeoutException来自网络呼叫滞后,而不是等待执行者完成其业务?是的,TimeoutException来自网络呼叫滞后。我认为您可以从这里得到您需要的答案,而不是重复回答
public class RetryableAsyncExecutor {
private final ExecutorService _exec;
private final CompletionService<RetryableAsyncTest> _comp;
public RetryableAsyncExecutor( int nThreads ) {
_exec = Executors.newFixedThreadPool( nThreads );
_comp = new ExecutorCompletionService<>( _exec );
}
public void submit( RetryableAsyncTest task ) {
_comp.submit( task );
}
public RetryableAsyncTest get() throws Exception {
final Future<RetryableAsyncTest> f = _comp.take();
final RetryableAsyncTest task = f.get();
if( task.isTimeouted()) {
_comp.submit( task );
}
return task;
}
public void shutdown() {
_exec.shutdown();
}
}
public class Main {
public static void main( String[] args ) {
final int COUNT = 8;
final RetryableAsyncExecutor re = new RetryableAsyncExecutor( 5 );
try {
for( int i = 0; i < COUNT; ++i ) {
re.submit( new RetryableAsyncTest("Async#"+(i+1)));
}
int count = 0;
while( count < COUNT ) {
final RetryableAsyncTest task = re.get();
if( task.isTimeouted()) {
System.err.printf( "%s: retrying (%d)\n",
task.getName(), task.getRetryCount());
}
else {
System.err.printf( "%s: done with '%s'.\n",
task.getName(), task.getValue());
++count;
}
}
}
catch( final Throwable t ) {
t.printStackTrace();
}
re.shutdown();
System.exit( 0 );
}
}
Async#4: done with 'computation result'.
Async#1: done with 'computation result'.
Async#6: retrying (1)
Async#3: done with 'computation result'.
Async#8: done with 'computation result'.
Async#7: retrying (1)
Async#2: done with 'computation result'.
Async#5: retrying (1)
Async#6: done with 'computation result'.
Async#7: done with 'computation result'.
Async#5: retrying (2)
Async#5: done with 'computation result'.