1

特定の条件下ですべてのパブリック メソッド呼び出しを追跡したいと考えています。しかし、この追跡によってシステム全体のパフォーマンスができるだけ損なわれないようにしたいと考えています。

指定されたスレッドに対してのみポイントカットを動的に「オン」にして実行する方法が必要であり、このオン (およびオフ) をコードから動的に呼び出すことができる必要があります。

つまり、私の Java コードが特定のことが起こったことを発見した場合、それはそれ自身のスレッドのポイントカットを有効にします。このポイントカットは、すべてのパブリック メソッド呼び出しをログに記録し、しばらく (またはいくつかのインターセプト) の後、ポイントカットはオフになります。

もちろん、「...getCurrentThread().equals(myMonitoringThread) && monitoringEnabled」のようなアドバイスでコードを呼び出すこともできますが、それはアドバイスがすべてのスレッドのすべてのパブリック メソッドに対して実行され、常にこのコードを実行することを意味します。アプリケーション全体のパフォーマンスが確実に低下します。

私が望むのは、有効な時間だけ選択したスレッドのパフォーマンスをペナトリーに分離し、残りのスレッドに影響を与えないことです。

誰かがそれを行う方法について知っていますか?

ありがとうトーマス

4

1 に答える 1

0

アスペクトを使用すると、クラスが影響を受けます。バイトコードはアスペクトに準拠するように変更されます (Spring の場合、呼び出しは専用のアスペクト準拠クラスでプロキシされます)。

AspectJ の場合、コンパイル中、コンパイル直後、またはロード時に実行できます (こちらをご覧ください)。インストルメント化されたクラスは、アスペクトが定義されている方法で影響を受けます (たとえば、すべてのパブリック メソッドをインターセプトします)。つまり、実行時に影響を実際に取り除くことはできません (クレイジーなコーダーがロード/アンロードを発明できると確信している場合でも)。それを処理するためのクラスメカニズムですが、それは非常識です;)。

したがって、あなたの質問に答えるために、単純な方法で実行時にアスペクトを完全にプラグ/アンプラグすることはできないと思います(それが可能な場合のみ!)。

于 2013-11-21T10:44:39.047 に答える