Является ли хорошей идеей создать пользовательскую аннотацию «Asynch» для асинхронного выполнения вызова метода? - PullRequest
1 голос
/ 17 марта 2012

Следующий код создает эту аннотацию.

Как описано здесь, 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 не возвращают никакого значения, в таком случае приведенный выше код сломается., Логично ли ожидать возвращаемого значения при асинхронном вызове метода?

1 Ответ

2 голосов
/ 17 марта 2012

Какие плюсы и минусы?

Вы должны быть в состоянии отработать плюсы.Если вы не можете думать ни о чем;у вас есть решение в поисках решения проблемы.Обычно идея состоит в том, чтобы улучшить производительность потока, который не ожидает результата вызова.

Минусы, если вы не будете осторожны, это может быть медленнее, чем быстрее.Зависит от voerhead от сэкономленного времени.

Что если бы мы использовали очередь сообщений и пул рабочих потоков для решения вместо асинхронного вызова метода?

Единственный способ узнать это - попробовать.

Какое решение можно было бы использовать из стандартной Java вместо такого собственного решения?

Вы можете использовать ExecutoreService, который возвращает объект Future.Вы можете получить результат или исключение с помощью get()

Вышеописанный метод, похоже, имеет одно отставание, при котором вызовы метода Asynch не возвращают никакого значения, в таком случае приведенный выше код будет нарушен., Логично ли ожидать возвращаемое значение при асинхронном вызове метода?

ExecutorServices возвращают Future, который может иметь возвращаемое значение, или Exception / Throwable, который является брошенным (другой возможный результат;)

...