Я пытаюсь подражать Spring AspectJ @Async support, но с шиной сообщений.Зная класс вызывающего абонента с AspectJ
Проблема заключается в том, что мне нужна моя шина сообщений (RabbitMQ MessageListener), вызывающая метод или обычный (все остальные) вызывающий, где метод будет немедленно возвращен.
Моя аннотация называется @MQAsync вместо Springs @Async.
package com.snaphop.mqueue;
import org.apache.log4j.Logger;
import com.snaphop.mqueue.MQAsync;
public aspect MQAsyncAspect {
//pointcut asyncTypeMarkedMethod() : execution(@MQAsync void *(..));
pointcut asyncTypeMarkedMethod() : call(@MQAsync void *(..));
private static final Logger log = Logger.getLogger("MQAsync");
Object around() : asyncTypeMarkedMethod() {
if (listenerIsCaller) {
return proceed();
}
//Send the method parameters to the message bus.
//this logic isn't here for brevity.
return null;
}
}
вызова среза точек получите мне контекст вызывающего абонента, но это не будет работать, как я буду называть этот метод с моим слушателем сообщения через отражение. Выполнение pointcut (закомментировано) не скажет мне, кто вызывает этот метод.
Есть ли способ определить класс вызывающего абонента, возможно, через какой-то анализ дампа стека?
Я понял, что это будет что-то вроде этого, но я нервничал, что это было бы непредсказуемо из-за совета AspectJ. То есть stacktrace должен игнорировать советы аспект. Я предположил, что могу просто сделать getStackTrace() [3] или getStackTrace [4] и т. Д. Через пробную версию и ошибку. –
Я думаю, что стоит сказать, что использование 'Thread.currentThread(). GetStackTrace()' намного медленнее, чем получение трассировки стека через 'new Throwable(). GetStackTrace()' См. Http://bugs.java.com/ bugdatabase/view_bug.do? bug_id = 6375302 –