1

以下代碼創建該註釋。爲方法調用的異步執行創建自定義「Asynch」註釋是個好主意嗎?

如這裏所描述的, http://engineering.webengage.com/2012/03/12/a-peek-into-webengages-security-layer-super-cool-use-of-java-annotations

/** 
* Defining the Asynch interface 
*/ 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Asynch {} 

/** 
* Implementation of the Asynch interface. Every method in our controllers 
* goes through this interceptor. If the Asynch annotation is present, 
* this implementation invokes a new Thread to execute the method. Simple! 
*/ 
public class AsynchInterceptor implements MethodInterceptor { 
    public Object invoke(final MethodInvocation invocation) throws Throwable { 
    Method method = invocation.getMethod(); 
    Annotation[] declaredAnnotations = method.getDeclaredAnnotations(); 
    if(declaredAnnotations != null && declaredAnnotations.length > 0) { 
     for (Annotation annotation : declaredAnnotations) { 
     if(annotation instanceof Asynch) { 
      //start the requested task in a new thread and immediately 
      //return back control to the caller 
      new Thread(invocation.getMethod().getName()) { 
      public void execute() { 
       invocation.proceed(); 
      } 
      }.start(); 
      return null; 
     } 
     } 
    } 
    return invocation.proceed(); 
    } 
} 

而且它使用的方法調用不返回任何內容(無效)。

例,

/** 
* So, earlier we had a simple method in our interface which we later 
* annotated with the Asynch @interface. Bang! The caller doesn't need 
* to worry about it now. This method (no matter who the caller is) 
* gets executed asynchronously. Ain't that awesome? 
*/ 
@Asynch 
public void refreshSurveyStatusOnResponse(String licenseCode, Integer surveyId); 

哪些利弊?如果我們使用消息隊列和工作線程池來解決而不是異步方法調用呢? 從標準的Java而不是這種本土解決方案可以使用什麼解決方案? 上面的方法似乎有一個積壓,Asynch方法調用不會在這種情況下返回任何值上面的代碼將打破。期望異步方法調用的返回值是否合乎邏輯?

回答

2

有什麼優點和缺點?

你應該能夠找出利弊。如果你想不出什麼;你有一個解決方案尋找一個問題來解決。通常這個想法是提高不等待調用結果的線程的性能。

缺點,如果你不小心,它可能會更慢,而不是更快。取決於voerhead與節省的時間。

如果我們使用消息隊列和工作線程池來解決而不是異步方法調用,該怎麼辦?

知道的唯一方法就是嘗試一下。

從標準的Java而不是這種本土解決方案中可以使用什麼解決方案?

您可以使用返回Future對象的ExecutoreService。你可以得到的結果或異常與get()

以上方法似乎有一個積壓非同步的方法調用不會在上面的代碼將打破這樣的情況下返回任何值。期望異步方法調用的返回值是否合乎邏輯?

ExecutorServices返回一個未來其可具有一個返回值或異常/ Throwable的其是投擲(另一種可能的結果)

+1

謝謝!我有類似的想法,現在他們被驗證! – 2012-03-17 13:31:49

相關問題