Có thể trong springframework để ghi lại thời gian được thực hiện theo các phương pháp [chọn lọc | tất cả] một cách tự động. Bởi tự động tôi có nghĩa là, tôi không muốn đi đến từng phương pháp và viết log.debug ("...."); đồ đạc.Làm cách nào để ghi lại thời gian được thực hiện bằng các phương thức trong Springframework?
Trả lời
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>
và <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>
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().
bạn có thể đưa ra một số ví dụ không? –
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>
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/
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:
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
- 1. Tìm thời gian thực hiện Phương thức
- 2. Làm cách nào để tìm các phương thức được khai báo, khi thực hiện tải lắp ráp thời gian chạy?
- 3. Ghi lại mọi phương thức thực thi
- 4. Làm thế nào để có được thời gian thực hiện bằng cách sử dụng msp430?
- 5. Phản ánh Java: Làm cách nào để ghi đè hoặc tạo phương thức trong thời gian chạy?
- 6. Làm cách nào để in các truy vấn được thực hiện bởi phương thức django .save()?
- 7. Tôi làm cách nào để truy xuất các bản ghi được cập nhật trong thời gian thực? (thông báo đẩy?)
- 8. Làm cách nào để ghi đè phương thức __call__ của đối tượng phương thức bằng Python?
- 9. Ghi lại các bản ghi thời gian qua nửa đêm
- 10. Làm thế nào để thực hiện một bảng thời gian bằng cách sử dụng JPA?
- 11. Làm cách nào để triển khai thời gian chờ phương thức đồng bộ trong Java?
- 12. Tại sao các phương thức giao thức tùy chọn chưa thực hiện gây ra lỗi thời gian chạy khi phương thức đó được gọi trong obj-c?
- 13. Thực hiện giao diện tại thời gian chạy: phương thức get_Value không được triển khai
- 14. Thời gian thực hiện bằng cách nhập bằng Python
- 15. Làm cách nào để tìm phương pháp nào được gọi từ phương thức lớp C# - KHÔNG ở thời gian chạy
- 16. Cách thực hiện các giao dịch Fragment trong FragmentPagerAdapter trong phương thức gọi lại onLoadFinish?
- 17. C++: làm thế nào để có được thời gian thực tế với thời gian và giờ địa phương?
- 18. Làm cách nào để ẩn các phương thức trong F #?
- 19. Thực hiện gọi lại phương thức trong Android
- 20. Cách tạo phương thức trong thời gian chạy bằng cách sử dụng Reflection.emit
- 21. Làm thế nào để có được thời gian một người bạn đã được thực hiện?
- 22. Cách thực hiện dấu thời gian tự động cho các thay đổi bản ghi (SQL Server)
- 23. Cách thực hiện các phương thức gọi lại bên trong các lớp (PHP)
- 24. Làm thế nào để bạn thực hiện các phương thức compareTo một cách rõ ràng?
- 25. Làm cách nào để sắp xếp lại các phương thức được tạo tự động trong Netbeans?
- 26. Jprofiler 7.2.2 - làm thế nào để tôi xem thời gian dành cho các phương thức
- 27. Làm thế nào để thực hiện phương thức update() trong DAO bằng EntityManager (JPA)?
- 28. Thời gian chờ phương thức MSMQ Receive()
- 29. Làm cách nào để gọi một số phương thức chặn với thời gian chờ trong Java?
- 30. Làm thế nào để sử dụng struct timeval để có được thời gian thực hiện?
+1 Có vẻ như đây là những gì tôi đã yêu cầu :). –
thực sự tốt. Xin chúc mừng –
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 * * –