Spring のAspectJ @Async サポートを模倣しようとしていますが、メッセージ バスを使用しています。
問題は、メッセージ バス (RabbitMQ MessageListener) がメソッドを呼び出しているか、メソッドが即座に返される通常の (他のすべての) 呼び出し元を呼び出しているかを知る必要があることです。
私の注釈は、Springs @Async ではなく @MQAsync と呼ばれます。
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;
}
}
ポイントカットを呼び出すと呼び出し元のコンテキストが取得されますが、リフレクションを介してメッセージリスナーでメソッドを呼び出すため、これは機能しません。実行ポイントカット (コメント アウト) では、誰がメソッドを呼び出しているかわかりません。
おそらく何らかのスタックダンプ分析を通じて、呼び出し元クラスを特定する方法はありますか?