Следующий код создает эту аннотацию.
Как описано здесь, 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();
}
}
И он используется с вызовами методов, которые ничего не возвращают (void).
Пример,
/**
* 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 не возвращают никакого значения, в таком случае приведенный выше код сломается., Логично ли ожидать возвращаемого значения при асинхронном вызове метода?