2013-04-07 63 views
1

例如我期望找到一種不完全異步執行方法。 例如,我想調用@Async任務,如果任務尚未完成,該任務將阻止我的進程達到最長限定的時間。java彈簧異步未來時間塊

@Async 
public Future<ModelObject> doSomething() { 
    //here we will block for a max allowed time if task still haven't been completed 
} 

所以這樣的代碼將是半異步的,但阻塞時間可以由開發人員控制。

P.S:當然,我可以通過在有限的時間內阻止調用線程來實現這一點。但我期待在彈簧層內實現

+0

可能重複(HTTP:/ /stackoverflow.com/questions/3785197/providing-a-timeout-value-when-using-async-for-a-method-using-spring-3-0) – 2013-04-07 08:04:08

+0

沒有。這不是重複的問題,因爲如何限制整個異步任務執行的時間。 – 2013-04-07 08:35:48

回答

0

總之,沒有辦法配置Spring來做到這一點。

@Async註釋由AsyncExecutionInterceptor處理,它將工作委託給AsyncTaskExecutor。理論上,您可以編寫自己的AsyncTaskExecutor實現,但即使如此,也無法使用註釋將期望的等待時間傳遞給執行程序。即使如此,我不清楚調用者的界面是什麼樣子,因爲他們仍然會得到一個Future對象。您可能還需要繼承Future對象的子類。基本上,當你完成的時候,你將會從頭開始重新編寫整個特性。

你總是可以包返回Future對象在自己WaitingFuture代理提供一個備用的get實現儘管後來連你有沒有對被叫方指定的等待值的方式:

WaitingFuture<ModelObject> future = new WaitingFuture<ModelObject>(service.doSomething()); 
ModelObject result = future.get(3000); //Instead of throwing a timeout, this impl could just return null if 3 seconds pass with no answer 
if(result == null) { 
    //Path A 
} else { 
    //Path B 
} 

或者如果你不想寫自己的課,那就趕上TimeoutException

Future<ModelObject> future = doSomething(); 
try { 
    ModelObject result = future.get(3000,TimeUnit.MILLISECONDS); 
    //Path B 
} catch (TimeoutException ex) { 
    //Path A 
} 
+0

輝煌!謝謝!! – 2013-04-07 15:27:36

0

您可以返回一個未來的@Async方法做到這一點:使用@Async爲使用Spring 3.0的方法時提供的超時值]的

 Future<String> futureString = asyncTimeout(10000); 
     futureString.get(5000, TimeUnit.MILLISECONDS); 

     @Async 
     public Future<String> asyncTimeout(long mills) throws InterruptedException { 

       return new AsyncResult<String>(
        sleepAndWake(mills) 
       ); 
     } 

     public String sleepAndWake(long mills) throws InterruptedException{ 
      Thread.sleep(mills); 
      return "wake"; 
     }