2009-09-30 24 views

Trả lời

17

AOP là những gì bạn cần ở đây. AOP cho phép bạn thêm mã vào ứng dụng của mình mà không cần sửa đổi mã gốc. Spring AOP muốn thực hiện điều này với các đối tượng Proxy. Proxy đối tượng sử dụng Mẫu trang trí để bọc đối tượng Mục tiêu đích và thêm mã. Proxy được định cấu hình để triển khai một hoặc nhiều giao diện của đối tượng Mục tiêu đích.

Ở đây, với thời gian một ứng dụng, ý tưởng là sử dụng PerformanceMonitorInterceptor, một trong các lớp giám sát hiệu suất đi kèm với khung công tác Spring.

Tùy chọn đầu tiên là sử dụng lớp Spring ProxyFactoryBean để tạo các đối tượng Spring AOP Proxy. Để làm điều này:

  • Xác định gốc đậu của bạn:
  • Xác định một PerformanceMonitorInterceptor:
  • Xác định một RegexpMethodPointcutAdvisor:
  • Xác định một ProxyFactoryBean để proxy đậu ban đầu của bạn và áp dụng Cố vấn của bạn
  • Đặt mức nhật ký cho số PerformanceMonitorInterceptor thành TRACE

Dưới đây là một cấu hình Spring minh họa các bước sau:

<beans> 
    <bean id="MyServiceTarget" class="org.myapp.services.MyService"> 
    <property ... /> 
    </bean> 

    <bean id="timingLogger" class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/> 

    <bean id="timingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 
    <property name="advice" ref="timingLogger"/> 
    <property name="patterns"> 
     <list> 
     <value>.*</value> 
     </list> 
    </property> 
    </bean> 

    <bean id="MyService" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="proxyInterfaces"> 
     <value>org.myapp.services.MyService</value> 
    </property> 
    <property name="target"><ref local="MyServiceTarget"/></property> 
    <property name="interceptorNames"> 
     <list> 
     <value>timingAdvisor</value> 
     </list> 
    </property> 
    </bean> 
</beans> 

Và cấu hình của mức Log cho PerformanceMonitorInterceptor:

log4j.logger.org.springframework.aop.interceptor.PerformanceMonitorInterceptor=TRACE 

Bắt đầu với Spring 2.0, có một lựa chọn khác: sử dụng Spring 2.0 XML Schema-based configuration và Spring AspectJ style pointcut expressions. Với ProxyFactoryBean, bạn phải khai báo rõ ràng các giao diện bạn muốn proxy; bằng cách sử dụng các thẻ <aop:config><aop:advisor>, bạn có thể tự động ủy quyền mọi giao diện của mọi đối tượng trong vùng chứa bean.

<beans "add xsd declarations here" > 
    <bean id="MyService" class="org.myapp.services.MyService"> 
    <property ... /> 
    </bean> 

    <bean id="timingAdvice" 
class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/> 

    <aop:config> 
    <aop:advisor pointcut="execution(* org.myapp.services.MyService.*(..))" 
     advice-ref="timingAdvice"/> 
    </aop:config> 
</beans> 
+0

+1 Có vẻ như đây là những gì tôi đã yêu cầu :). –

+0

thực sự tốt. Xin chúc mừng –

+0

Tôi không biết tại sao nhưng nó không hoạt động. Ngoài ra, hãy chỉnh sửa mã của bạn từ * * thành * * –

1

Bạn có thể sử dụng AspectJ cho điều này, khai báo một dấu mốc nhật ký được gọi bằng ký tự đại diện có xử lý trước và sau bằng lời khuyên trước() và sau().

+0

bạn có thể đưa ra một số ví dụ không? –

2

Cuối cùng, tôi đã tìm ra cách thực hiện việc này.

Trước hết hãy xem bài đăng theo 'Pascal Thivent', nó đã giúp tôi rất nhiều. Sau khi thay đổi log4j.properties và tạo timingAdvisor những gì bạn phải làm, hãy liên kết cố vấn này với lớp bạn muốn bật gỡ lỗi. Bạn phải thay đổi mã của bạn như thế này.

mã trước:

<bean id="myTableDao" class="com.xyz.sc.db.dao.MyTableDaoImpl" parent="commonDataSource" >     
      <property name="anotherDao" ref="anotherDao"/> 
    </bean> 

Code mới.

<bean id="myTableDaoTarget" class="com.xyz.sc.db.dao.MyTableDaoImpl" parent="commonDataSource" >     
     <property name="anotherDao" ref="anotherDao"/> 
</bean> 


    <bean id="myTableDao" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="proxyInterfaces"> 
     <value>com.xyz.sc.db.dao.MyTableDao</value> 
    </property> 
    <property name="target"><ref local="myTableDaoTarget"/></property> 
    <property name="interceptorNames"> 
     <list> 
      <value>timingAdvisor</value> 
     </list> 
    </property> 
</bean> 
1

tôi thấy rằng có đã là một câu trả lời được chấp nhận ở đây, nhưng tôi muốn khuyến khích mọi người hãy nhìn vào phiên bản mới nhất của mùa xuân Toolsuite (distro của Eclipse SpringSource của). Nó đi kèm với một tiện ích lược tả ra khỏi hộp, Spring Insight, cung cấp các số liệu thống kê chính xác này khi chạy trong một định dạng đẹp. Chỉ cần triển khai ứng dụng của bạn vào tomcat bên trong của nó, nhấn một vài trang, sau đó đi đến servlet/insight và xem thời gian được thực hiện trong mỗi phương thức được gọi là tất cả các câu lệnh SQL đã được thực thi và mất bao lâu.

Đây là liên kết đến một bài viết hay về Spring Insight sẽ giúp bạn có được những gì bạn muốn chỉ trong vài phút. http://www.dotkam.com/2009/10/28/spring-insight-in-action-5-minutes-from-scratch/

4

Bạn có thể xem stagemonitor. Nó là một màn hình hiệu suất ứng dụng web java mã nguồn mở. Nó nắm bắt số liệu thời gian phản hồi, số liệu JVM, chi tiết yêu cầu (bao gồm ngăn xếp cuộc gọi được trình thu thập yêu cầu ghi lại) và hơn thế nữa. Chi phí rất thấp.

Tùy chọn, bạn có thể sử dụng graphite cơ sở dữ liệu thời gian tuyệt vời với nó để lưu trữ một lịch sử lâu dài của datapoints mà bạn có thể xem xét với các biểu đồ ưa thích.

Ví dụ Ảnh chụp màn hình: enter image description here

Hãy nhìn vào các project website để xem thêm ảnh chụp màn hình, giới thiệu tính năng và tài liệu hướng dẫn.

Lưu ý: Tôi là nhà phát triển của stagemonitor

Các vấn đề liên quan