2011-03-24 57 views
6

我已經通從現場的Perf4下面的鏈接,也做了同樣以相同:http://perf4j.codehaus.org/devguide.html#Using_Spring_AOP_to_Integrate_Timing_Aspects的Perf4 @Profiled註解不工作

加在我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; 
    } 
} 

我錯過了什麼?

+0

所有Codehaus服務已終止。您與Codehaus的鏈接已損壞。 – naXa 2016-01-06 08:15:18

回答

9

Perf4j 這是應用程序的性能分析和檢查插件。它可以使用彈簧AOP與彈簧結合。它創建一個日誌文件,供給解析器來分析和生成相關信息。它可以默認提供平均,平均,標準偏差。 有關更多一般信息,請查看http://perf4j.codehaus.org/index.html

如何設置Perf4j。 對於正常的設置,您只需添加perf4j jar併爲要監控的每個代碼sniplet創建StopWatch實例。

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

這將創建perf4j監視器,您將獲得控制檯上的logg信息。

本文檔的主要目的是通過安裝瞭解將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.創建 自己logback.xml將被隱含的Perf4被 使用的logback.xml的內容將是

<configuration> 

    <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> 

    <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> 

    <!-- 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.In你的需要添加的AspectJ標籤,使Spring配置文件@ prof4j的配置文件註釋。

**>(注:什麼是@Profiled註解?:你會在所有被從春季實例調用或使用 依賴注入的類此標記添加到所有

方法的對象基本上應該是彈簧上下文 註冊並且該方法應該由彈簧上下文中註冊的對象 調用。我浪費1天想爲什麼當時沒有記錄我的方法 我意識到,我測試的對象是不是春天上下文的一部分 。**

OK the code that you need to add to spring configuration xml is. 

<!-- 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.Create測試類,將實現@Profiled註解。

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上下文,並加載它的Perf4。

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控制檯appender在控制檯上顯示一行。在日誌 用於生成您記錄路徑上的性能統計信息執行 的Java

的Perf4監控命令罐子的Perf4-0.9.16.jar myLogger.log

對於生成圖形 Java的罐子的Perf4-0.9。 16.jar --graph perfGraphs.out myLogger.log

我希望本教程能幫助您將Spring,perf4j,logback與集成註釋集成在一起。

2

嘗試在<aop:aspectj-autoproxy/>內添加< aop:include name="timingAspect"/>

您還可以確認您正在從spring應用程序上下文(使用getBean或注入爲依賴項)檢索到的對象上調用sendMessage。

+0

你說得對,WscClientBase.java類有sendMessage(),它不是從spring應用程序上下文中獲取的。有一組類被注入爲依賴項,EXTEND WscClientBase.java和@Profiled對它們進行了處理。有沒有一種方法可以讓@Profiled工作在WscClientBase.java的方法或其他任何方法上?謝謝! – 2011-03-28 15:39:48

0

它無法工作的原因是profiled方法在Spring-bean的父類中。我可以通過查看你的bean名稱來告訴它:WscClientBase。我假設這是你有很多子類的基類。

經過一番研究,我在Spring文檔中發現了有關@Transactional和@Cacheable的非常重要的注意事項。

在這兩種情況下,他們說,這樣的事情:

「當使用代理服務器,你應該應用<>註釋只 方法與公衆知名度。如果使用這些註釋標註受保護的,私有的 或包可見方法,則不會引發錯誤, 但註釋的方法不會顯示配置的緩存 設置。考慮使用的AspectJ(見下文),如果你需要 註解非公共方法,因爲它改變了字節碼本身。」

及以下...

「春建議您只標註具體類(具體類的 方法),@ Cache *註釋,而不是 註解接口。您當然可以將@Cache * 註釋放置在接口(或接口方法)上,但這僅適用於 ,正如您使用基於接口的 代理所預期的那樣。Java註釋不是從 接口繼承的事實意味着如果您正在使用基於類的代理 (proxy-target-class =「true」)或基於交織的方面( mode =「aspectj」),則緩存設置不被 代理和編織基礎設施的認可,並且對象不會 包裹在一個緩存代理,這將是決定性的壞。」

我認爲@Profiled因此你會使用類似編織機制不能把@Profiled放在父類的任何方法上。 事實上,我在我的應用程序中有類似的問題:我在父類中有@Profiled和@Cacheable,但沒有一個工作:我沒有在我的Perf4J日誌中看到任何記錄,並且緩存沒有更新。當我將@Profiled移動到children-classes的方法中時,我開始在perf4j.log中看到記錄。

1

在這裏我有兩種方法使perf4j @Profiled工作在春季啓動項目。 前提條件是加入下面的依賴

"org.aspectj:aspectjweaver", 
"org.perf4j:perf4j:0.9.16", 
"commons-jexl:commons-jexl:1.1", 
"cglib:cglib:3.2.1", 

對於通常彈簧項目,可能需要補充一點的依賴性如春的AOP,aopalliance ......包括在彈簧引導啓動父那些看起來

1. Java配置

這是最簡單的方式,主要工作,但我發現,不知何故不在春季數據JpaRepository方法工作。它只提供org.perf4j.log4j.aop.TimingAspect bean並執行aspectj autoproxing。其他人之上

@Configuration 
@EnableAspectJAutoProxy 
public class PerformanceConfig { 
    @Bean 
    public TimingAspect timingAspect() { 
     return new TimingAspect(); 
    } 
} 

2.提供諸如XML配置相同的方式提供自己的看點

這樣,在@Profiled註釋彈簧數據倉庫接口方法也很好地工作。但是它的缺點是忽略了@Profiled(tag ='some tag')中給出的標籤,並使用joinPoint方法名稱作爲標籤。

@Aspect 
@Component 
public class PerformanceTracker { 

    @Around(value="execution(@org.perf4j.aop.Profiled * com.mypackage..*(..))") 
    public Object checkPerformance(ProceedingJoinPoint pjp) throws Throwable { 
     StopWatch stopWatch = new Log4JStopWatch(pjp.getSignature().toShortString()); 
     Object result = pjp.proceed(); 
     stopWatch.stop(); 
     return result; 
    } 
} 
0

放下面的配置在 「的servlet上下文-config.xml中」。有樂趣!

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

對於誰擁有這種類型的問題,他們可以檢查有沒有在春季日誌(級信息)的人,喜歡它的消息「不符合所有BeanPostProcessor的得到處理(例如:沒有資格自動代理)」。