7

私はperf4Jサイトから以下のリンクをたどり、同じことをしました:http://perf4j.codehaus.org/devguide.html#Using_Spring_AOP_to_Integrate_Timing_Aspects

spring.xml に以下を追加しました。

<aop:aspectj-autoproxy/>
<bean id="timingAspect" class="org.perf4j.log4j.aop.TimingAspect"/>
<bean id="wscClientBase" class="com.xyz.csa.core.common.WscClientBase"/>

クラス WscClientBase には、@Profiledアノテーションを使用した次のメソッドがあります。

@Profiled(tag = "SOAPCALLTEST")
public Object sendMessage(Object message) {
    String msg = message.toString();
    if (msg.indexOf(' ') > 1) {
        msg = msg.substring(1, msg.indexOf(' '));
    }
    try {
        Object ret = marshalSendAndReceive(message);
        return ret;
    } catch (RuntimeException ex) {
        throw ex;
    }
}

アプリケーション ログに perf4j TimingLogger ステートメントが表示されません。ただし、以下のように目立たないように (注釈なしで) 使用すると、ログ ステートメントが正常に表示されます。

public Object sendMessage(Object message) {
    String msg = message.toString();
    if (msg.indexOf(' ') > 1) {
        msg = msg.substring(1, msg.indexOf(' '));
    }
    StopWatch stopWatch = new Slf4JStopWatch();
    try {
        Object ret = marshalSendAndReceive(message);
        stopWatch.stop("PERF_SUCCESS_TAG", msg);
        return ret;
    } catch (RuntimeException ex) {
        stopWatch.stop("PERF_FAILURE_TAG", msg);
        throw ex;
    }
}

何か不足していますか?

4

6 に答える 6

9

Perf4j

これは、アプリケーションのパフォーマンス分析およびチェック プラグインです。スプリング AOP を使用してスプリングと統合できます。関連情報を分析して生成するためにパーサーに提供されるログ ファイルを作成します。デフォルトで、平均、平均、標準偏差を提供できます。より一般的な情報については、http://perf4j.codehaus.org/index.htmlを確認してください。

Perf4j のセットアップ方法。通常のセットアップでは、perf4j jar を追加し、監視するすべてのコード スニペットの StopWatch インスタンスを作成するだけです。

StopWatch stopWatch= new StopWatch(“snipletTagName”)
…
//{your code sniplet}
…
stopwatch.stop();

これにより、perf4j モニターが作成され、コンソールにログ情報が表示されます。

このドキュメントの主な目的は、perf4j と spring の統合をセットアップごとに理解することです。

1.以下のJarファイルをすべて追加します。

   1.perf4j-0.9.16-slf4jonly.jar
   2.aspectjweaver-1.6.12.jar
   3.aopalliance-1.0.jar
   4.commons-logging-1.1.1.jar
   5.logback-classic-1.0.7.jar
   6.logback-core-1.0.7.jar
   7.slf4j-api-1.7.1.jar
   8.perf4j-0.9.16.jar
   9.aspectjrt-1.6.1.jar
   10.commons-jexl-1.1.jar
   11.asm-1.5.3.jar
   12.cglib-2.1_3.jar

これらすべての jar がクラスパスに含まれていることと、Spring ライブラリがあることを確認してください。

2. perf4j によって暗黙的に使用される独自の logback.xml を作成します。logback.xml の内容は次のようになります。

<configuration>
    <appender name="perf4jFileAppender"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>logs/perf4j.log</File>
        <encoder>
            <Pattern>%date %-5level [%thread] %logger{36} [%file:%line] %msg%n
            </Pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>logs/perf4j.%d{yyyy-MM-dd}.log</FileNamePattern>
        </rollingPolicy>
    </appender>

    <appender name="CoalescingStatistics"
        class="org.perf4j.logback.AsyncCoalescingStatisticsAppender">
        <param name="TimeSlice" value="1" />        
        <appender-ref ref="perf4jFileAppender" />       
    </appender>

    <appender name="RootConsoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date %-5level [%thread] %logger{36} [%file:%line] %msg%n
            </pattern>
        </layout>
    </appender>

    <!-- Loggers -->
    <!-- The Perf4J logger. Note that org.perf4j.TimingLogger is the value of 
        the org.perf4j.StopWatch.DEFAULT_LOGGER_NAME constant. Also, note that additivity 
        is set to false, which is usually what is desired - this means that timing 
        statements will only be sent to this logger and NOT to upstream loggers. -->
    <logger name="org.perf4j.TimingLogger" additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="CoalescingStatistics" />
        <appender-ref ref="perf4jFileAppender" />
        <appender-ref ref="RootConsoleAppender" />
    </logger>
</configuration>

3.Spring 構成ファイルで、perf4j の @Profiled アノテーションを有効にする aspectj タグを追加する必要があります。

(注: @Profiled アノテーションとは何ですか?: このタグは、Spring インスタンスから呼び出される、または依存性注入を使用するすべてのクラスのすべてのメソッドに追加します。オブジェクトは基本的に Spring コンテキストに登録されている必要があり、メソッドはによって呼び出される必要がありますなぜ私のメソッドがログに記録されないのかを考えて 1 日を無駄にした後、テストしたオブジェクトが Spring コンテキストの一部ではないことに気付きました。

OK、Spring 構成 xml に追加する必要があるコードは次のとおりです。

<!-- this is my spring-context.xml -->
<beans>

    <aop:aspectj-autoproxy>
        <aop:include name="timingAspect" />
    </aop:aspectj-autoproxy>

    <bean id="timingAspect" class="org.perf4j.slf4j.aop.TimingAspect" />

<!-- this is the class that will be registered with the spring and now we can get this class and call the method that we need to monitor-->
    <bean class="com.perf4jexample.Test" />


</beans>

4. @Profiled アノテーションを実装する Test クラスを作成します。

public class Test {

    private String testVal;

    public Test() {
        // TODO Auto-generated constructor stub
    }

    @Profiled
    public void testing() {
        System.out.println("testt" );
    }

    public String getTestVal() {
        return testVal;
    }

    public void setTestVal(String testVal) {
        this.testVal = testVal;
    }
}

5.OK これですべての設定が完了しました。残っているのは、Spring コンテキストを開始し、perf4j をロードするテスト クラスです。

public class Test(){

public static void main(){
        AbstractApplicationContext context = new ClassPathXmlApplicationContext(
                "spring-context.xml");

        context.start();

        Test bean = context.getBean(Test.class);
        bean.testing();
}

これらの設定に従うことで、コンソール アペンダーを perf4j してコンソールに 1 行を表示できるようになることを願っています。

ログの Perf4j 監視コマンド:

パフォーマンス統計情報を生成するには、ロガー パスで実行します

java -jar perf4j-0.9.16.jar myLogger.log

グラフ生成用

java -jar perf4j-0.9.16.jar --graph perfGraphs.out myLogger.log

このチュートリアルが、Spring、perf4j、logback を Profiled アノテーションと統合するのに役立つことを願っています。

于 2012-09-19T11:57:19.253 に答える
2

aop:include name="timingAspect"/>の中に< を追加してみてください<aop:aspectj-autoproxy/>

また、Spring アプリケーション コンテキストから取得したオブジェクトで sendMessage を呼び出していることを確認できますか (getBean を使用するか、依存関係として注入されます)。

于 2011-03-24T07:51:55.120 に答える
0

このタイプの問題を抱えている人は、Spring ログ (レベル情報) に「すべての BeanPostProcessors によって処理される資格がありません (例: 自動プロキシの資格がない)」のようなメッセージがないことを確認できます。

于 2016-12-05T08:57:32.170 に答える
0

以下の構成を「servlet-context-config.xml」に入れます。楽しんでください!

    <aop:aspectj-autoproxy/>
    <bean id="timingAspect" class="org.perf4j.log4j.aop.TimingAspect"/>
    <bean id="wscClientBase" class="com.xyz.csa.core.common.WscClientBase"/>
于 2016-08-09T08:05:51.600 に答える
0

機能しなかった理由は、プロファイルされたメソッドが Spring Bean の親クラスにあるためです。Bean 名 WscClientBase を見ればわかります。これは、多くの子クラスを持つ基本クラスであると想定しています。

しばらく調査した後、@Transactional と @Cacheable に関する Spring のドキュメントで非常に重要なメモを見つけました。

どちらの場合も、次のように言います。

「プロキシを使用する場合、パブリックな可視性を持つメソッドにのみ <> アノテーションを適用する必要があります。これらのアノテーションを使用して保護されたプライベート メソッドまたはパッケージ可視メソッドにアノテーションを付けた場合、エラーは発生しませんが、アノテーションが付けられたメソッドは構成されたキャッシュ設定を示しません。バイトコード自体を変更するため、非パブリック メソッドにアノテーションを付ける必要がある場合は、AspectJ (以下を参照) の使用を検討してください。」</p>

そして以下…</p>

「Spring は、インターフェイスにアノテーションを付けるのではなく、@Cache* アノテーションを使用して、具象クラス (および具象クラスのメソッド) にのみ注釈を付けることをお勧めします。確かに @Cache* アノテーションをインターフェイス (またはインターフェイス メソッド) に配置できますが、これはインターフェイス ベースのプロキシを使用している場合に期待どおりにしか機能しません。Java アノテーションがインターフェースから継承されないという事実は、クラスベースのプロキシ (proxy-target-class="true") またはウィービングベースのアスペクト (mode="aspectj") を使用している場合、キャッシュ設定がプロキシおよびウィービング インフラストラクチャによって認識されず、オブジェクトはキャッシング プロキシにラップされません。これは明らかに悪いことです。」</p>

@Profiled は同様のウィービングメカニズムを使用すると想定しているため、親クラスのメソッドに @Profiled を配置することはできません。実際のところ、アプリケーションで同様の問題が発生しました。親クラスに @Profiled と @Cacheable がありましたが、どれも機能しませんでした。Perf4J ログにレコードが表示されず、キャッシュが更新されませんでした。@Profiled を子クラスのメソッドに移動すると、perf4j.log に記録が表示されるようになりました。

于 2014-11-14T18:36:16.423 に答える