Я использую Spring 3.0.5 с аспектом Around.
Формат @Around работает отлично.Выражение AOP предназначено для интерфейсов группы компонентов.
Аспект выполняет некоторую логику до и после вызова:
@Around(...)
public Object monitor(ProceedingJoinPoint pjp) throws Throwable {
// some code
Obj o = pjp.proceed();
// some code
}
Ничего страшного.
Теперь я пытаюсь создать еще один аспект, который вызывает исключение, если перехваченный метод занимает слишком много времени.
private static ExecutorService executor = Executors.newCachedThreadPool();
@Around(...)
public Object monitor(ProceedingJoinPoint pjp) throws Throwable {
Object obj = null;
Callable<Object> task = new Callable<Object>() {
public Object call() {
return pjp.proceed();
}
};
Future<Object> future = executor.submit(task);
try {
obj = future.get(timeout, TimeUnit.MILLISECONDS);
} catch (TimeoutException ex) {
...
} catch (InterruptedException e) {
// we ignore this one...
} catch (ExecutionException e) {
throw e.getCause(); // rethrow any exception raised by the invoked method
} finally {
future.cancel(true); // may or may not desire this
}
return obj;
}
Когда я выполняю код с применением только этого аспекта, я получаю следующее исключение:
java.lang.RuntimeException: java.lang.IllegalStateException: Метод не найден:Убедитесь, что выполняется вызов AOP и что ExposeInvocationInterceptor находится в цепочке перехватчиков.
Из документации Spring Я прочитал:
"Класс ExposeInvocationInterceptor
Перехватчик, который отображает текущее MethodInvocation как локальный объект потока. "
Таким образом, похоже, что цель потеряна, потому что я в основном запускаю новый поток, а новый поток не имеетдоступ к теме локальный.Есть ли способ решить эту проблему или лучший подход?
Спасибо