java拦截器项目应用_使用拦截器分析Java EE应用程序的性能下降/提高

java拦截器项目应用

在开发具有某些性能要求的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拦截器项目应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iis web.config 配置 经典模式_django部署在iis下,webconfig错误

django部署在iis下&#xff0c;webconfig错误错误原因&#xff1a;iis7以后&#xff0c;web.config管理机制更安全了默认情况下&#xff0c;会锁住配置项&#xff0c;不许修改怎么办&#xff1f;如何求解以上问题呢&#xff1f;D:django_websiteshello>%windir%C:Windows 不…

joo工作流_不要错过使用jOOλ或jOOQ编写Java 8 SQL单行代码的机会

joo工作流越来越多的人通过为他们的业务采用功能性编程来赶上我们平台的最新更新。 在Data Geekery &#xff0c;我们将Java 8用于jOOQ集成测试&#xff0c;因为将新的Streams API与lambda表达式一起使用使生成临时测试数据变得非常容易。 但是&#xff0c; 我们并不认为JDK提…

session mysql登录实现_PHP+MYSQL+MYSQL+SESSION实现用户登录的实例

这是我写的用户登录界面。session_start();include(menu2.php);require(configywcl.php);//加载配置文件require(functions.php);?>请登录系统if ($username){$passwordmd5($password);$sql"select * from user where username$username and password$password";…

mybatis mysql demo_SpringBoot(入门Demo,整合mybatis,连接mysql)

1.简介SpringBoot提供一种固定的、约定优于配置风格的框架&#xff0c;使开发者更快地创建基于spring的应用和程序。可以高效的创建基于Spring的应用服务(SpringBoot不是对spring功能的增强&#xff0c;而是可以更快速使用spring)。为微服务spring cloud铺路&#xff0c;可整合…

css table嵌套内部table不受外部影响_HTML+CSS网页一揽子(4)

CSS重要属性之浮动基本属性&#xff1a;float:left&#xff1b;左浮动float:right&#xff1b;右浮动float:none&#xff1b;不浮动(一般应用于覆盖既有浮动属性时使用)clear:both&#xff1b;清除浮动对其他元素带来的影响应用场景&#xff1a;(1)网站大的结构布局&#xff1a…

mysql ticks_【原创】C# 计时周期数(Ticks)在不同数据库上的实现

动手之前&#xff0c;先来看看 Ticks 在微软官方文档上的定义&#xff1a;注解一个计时周期表示一百纳秒&#xff0c;即一千万分之一秒。1 毫秒内有 10,000 个计时周期&#xff0c;即 1 秒内有 1,000万个计时周期。此属性的值表示自0001年1月1日午夜12:00:00 0:00:00 (公历日期…

在Spring Boot测试中使用Testcontainer进行数据库集成测试

在此博客文章中&#xff0c;我想演示如何在Spring Boot测试中集成Testcontainer以便与数据库一起运行集成测试。 我没有使用Testcontainers的Spring Boot模块。 如何与他们合作&#xff0c;我将在另一篇博客文章中进行介绍。 所有示例都可以在GitHub上找到 。 为什么要使用测试…

java8串行和并行的区别_垃圾收集器–串行,并行,CMS,G1(以及Java 8中的新增功能)...

java8串行和并行的区别4个Java垃圾收集器–错误的选择如何严重影响性能 在2014年&#xff0c;对于大多数开发人员来说&#xff0c;还有两件事仍然是个谜&#xff1a;垃圾收集和了解异性。 由于我对后者知之甚少&#xff0c;所以我认为我会对前者大吃一惊&#xff0c;尤其是因为…

python函数参数学习_python学习笔记-11.函数参数和返回值进阶

1. 函数参数和返回值的作用函数根据有没有参数以及有没有返回值&#xff0c;可以相互组合&#xff0c;共有4种形式&#xff1a;无参数&#xff0c;无返回值无参数&#xff0c;有返回值有参数&#xff0c;无返回值有参数&#xff0c;有返回值定义函数时&#xff0c;是否接收参数…

python邮件发送哪个好_python发邮件(一)

复习模块如果我们要发送邮件&#xff0c;就需要用到smtplib模块的以下方法&#xff1a;1、import smtplib #引入smtplib模块2、server smtplib.SMTP() #server为变量&#xff0c;通过SMTP指定一个服务器&#xff0c;这样才能把邮件送到另一个服务器&#xff0c;SMTP…

python逻辑运算符的使用_总结Python中逻辑运算符的使用

下表列出了所有python语言支持的逻辑运算符。假设变量a持有10和变量b持有20&#xff0c;则&#xff1a;示例:试试下面的例子就明白了所有的python编程语言提供了逻辑运算符&#xff1a;#!/usr/bin/pythona 10b 20c 0if ( a and b ):print "line 1 - a and b are true&q…

如何使用用户数据脚本在EC2实例上安装Apache Web Server

你好朋友&#xff0c; 在本教程中&#xff0c;我们将看到如何使用用户数据脚本在EC2实例上安装Apache Web Server。 在我以前的教程之一中&#xff0c;我已经解释了如何使用AWS控制台启动EC2实例。如果您还没有完成该操作&#xff0c;我建议您先进行一下操作。 首先&#xf…

spring 多租户_使用Spring Security的多租户应用程序的无状态会话

spring 多租户从前&#xff0c; 我发表了一篇文章&#xff0c;解释了构建无状态会话的原理 。 巧合的是&#xff0c;我们再次为多租户应用程序执行同一任务。 这次&#xff0c;我们将解决方案集成到Spring Security框架中&#xff0c;而不是自己构建身份验证机制。 本文将解释…

java api 1.6 下载_Java JDK API

JDKJavaDevelopmentKit是SunMicrosystems针对Java开发员的产品。自从Java推出以来&#xff0c;JDK已经成为使用最广泛的JavaSDK。JDK是整个Java的核心&#xff0c;包括了Java运行环境。相关软件软件大小版本说明下载地址jdk(Java Development Kit)是Sun Microsystems针对java开…

Java / Cloud:如何快速创建支持Kubernetes的REST微服务

可以肯定地说&#xff0c;如今微服务与云的结合风靡一时。 微服务的开发比以往任何时候都多&#xff0c;从而导致应用程序部署数量增加。 在过去的十年中&#xff0c;开发了诸如Docker和Kubernetes之类的容器化和编排工具&#xff0c;从而使微服务模式真正易于采用。 本文将教…

使用Spring Boot和Project Reactor处理SQS消息-第2部分

这是我关于使用Spring Boot和Project Reactor有效处理SQS消息的博客文章的后续文章 我在第一部分中列出了一些方法上的差距。 1.处理SQS客户端调用中的失败 2.该方法一次只能处理来自SQS的一条消息&#xff0c;如何并行化 3.它不处理错误&#xff0c;管道中的任何错误都会中…

java爬虫jsoup_Java爬虫之利用Jsoup自制简单的搜索引擎

内容导读在上述代码中&#xff0c;url为输入词条(暂时仅限于英文)&#xff0c;进入while循环可一直搜索&#xff0c;当输入为’exit’时退出。contentText为该词条的百度百科简介的网页形式&#xff0c;通过正则表达式将其中的文字提取出来。代码虽然简洁&#xff0c;但是功能还…

matplotlib的默认字体_浅谈matplotlib默认字体设置探索

控制默认字体的设置根据官方文档https://matplotlib.org/tutorials/text/text_props.html#default-font可知&#xff1a;The base default font is controlled by a set of rcParams默认字体是由一组rcParams控制的。rcParamusage‘font.family"List of either names of f…

java空心菱形_java 空心菱形

分为两部分&#xff0c;先打印前四行&#xff0c;再打印后三行&#xff0c;int n 4;    //设初始值为4for(int i0;ifor(int j0;jSystem.out.print(" ");}for(int k0;kif(k0||k2*i) {    //打印前四行的*&#xff0c;中间部分输出空格System.out.print(&quo…

java接口版本控制_为什么要在Java中控制类和接口的可见性

java接口版本控制维护是软件开发的重要方面之一&#xff0c;并且经验证明&#xff0c;保持较低组件可视性的软件比暴露更多组件的软件更易于维护。 您不会在一开始就意识到它&#xff0c;但是在重新设计应用程序时会严重错过它。 由于保持向后兼容性是许多应用程序的“必须具备…