使用拦截器分析Java EE应用程序的性能下降/提高
在開發具有某些性能要求的Java EE應用程序時,必須在每個發行版之前驗證是否滿足這些要求。 您可能會想到,哈德森的一項工作每天晚上在某些特定的硬件平臺上執行一系列測試測量。
您可以檢查已實現的時間并將它們與給定的要求進行比較。 如果測量值與要求的偏差太大,則可以中斷構建或至少向團隊發送電子郵件。
但是,如何測量代碼的執行時間呢? 最初的想法可能是在您的代碼庫中添加數千個時間測量代碼。 但這不僅是很多工作,而且還會影響代碼的性能,因為現在時間測量也已在生產中執行。 為了擺脫許多插入,您可能需要利用面向方面的框架(AOP),該框架引入了用于在編譯時進行時間測量的代碼。 使用這種方式,您至少可以擁有兩個版本的應用程序:一個有版本,一個沒有額外的開銷。 要在某些生產站點上衡量性能,仍然需要重新部署代碼。 而且,您必須決定要在編譯時觀察哪些方法。
因此,Java EE提供了一種易于使用的替代方案:攔截器。 這是當時控制模式反轉發揮其優勢的原因。 當Application Server調用您的bean方法/ Web服務調用時,它很容易攔截這些調用,并為您提供了在每次調用之前和之后添加代碼的方式。
這樣,使用攔截器就相當容易了。 您可以在目標方法或引用攔截器實現的類中添加注釋,也可以使用部署描述符添加攔截器:
@Interceptors(PerformanceInterceptor.class) public class CustomerService { ... }部署描述符中提供的相同信息如下所示:
<interceptor-binding><target-name>myapp.CustomerService</target-name><interceptor-class>myapp.PerformanceInterceptor.class</interceptor-class> </interceptor-binding>攔截器本身可以是一個簡單的POJO類,其方法帶有@AroundInvoke和一個參數:
@AroundInvoke public Object measureExecutionTime(InvocationContext ctx) throws Exception {long start = System.currentTimeMillis();try {return ctx.proceed();} finally {long time = System.currentTimeMillis() - start;Method method = ctx.getMethod();RingStorage ringStorage = RingStorageFactory.getRingStorage(method);ringStorage.addMeasurement(time);} }在try塊之前和finally塊中,我們添加了用于時間測量的代碼。 從上面的代碼可以看出,我們還需要一些內存中的位置,可以在其中存儲最后的測量值,以便計算例如平均值和與平均值的偏差。 在此示例中,我們有一個簡單的環形存儲實現,該實現會在一段時間后覆蓋舊值。
但是如何將這些價值觀暴露給外界? 由于通過JMX接口公開了Application Server的許多其他值,因此我們可以實現一個簡單的MXBean接口,如以下代碼片段所示:
public interface PerformanceResourceMXBean {long getMeanValue(); }public class RingStorage implements PerformanceResourceMXBean {private String id;public RingStorage(String id) {this.id = id;registerMBean();...}private void registerMBean() {try {ObjectName objectName = new ObjectName("performance" + id + ":type=" + this.getClass().getName());MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();try {platformMBeanServer.unregisterMBean(objectName);} catch (Exception e) {}platformMBeanServer.registerMBean(this, objectName);} catch (Exception e) {throw new IllegalStateException("Problem during registration:" + e);}}@Overridepublic long getMeanValue() {...}... }現在,我們可以啟動jconsole并查詢暴露的MXBean的平均值:
編寫一個小的JMX客戶端應用程序,例如將采樣值寫入CSV文件,使您以后可以處理這些值并將它們與以后的測量值進行比較。 這為您提供了應用程序性能演變的概述。
結論
通過使用攔截器,可以輕松地通過部署描述符性能評估功能向現有Java EE應用程序動態添加功能。 如果通過JMX公開了測量值,則可以在以后應用這些值的進一步處理。
翻譯自: https://www.javacodegeeks.com/2014/09/analysing-the-performance-degradationimprovements-of-a-java-ee-application-with-interceptors.html
總結
以上是生活随笔為你收集整理的使用拦截器分析Java EE应用程序的性能下降/提高的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何自己装无线路由器如何装无线网络路由器
- 下一篇: 将Spring 3.x和Hibernat