spring 异常捕获异常_使用Spring跟踪异常–第2部分–委托模式

spring 异常捕获异常

在上一个博客中 ,我开始谈论需要弄清您的应用程序在生产环境中是否行为异常。 我说过,监视应用程序的一种方法是检查其日志文件是否存在异常,如果发现异常,则采取适当的措施。 显然,日志文件可能会占用数百兆的磁盘空间,用手监视它们是不切实际的,而且很无聊。

我还说过,有几种方法可以自动监视日志文件,并提出了一个基于Spring的实用程序,该实用程序每天都会梳理日志文件,并在发现任何异常时向您发送电子邮件。

我只介绍了第一类: FileLocator ,它将在目录及其子目录中搜索日志文件。 找到一个后,将其传递给FileValidator

FileValidator必须对文件执行多项检查。 首先,它必须确定文件是否足够年轻以检查异常。 想法是,由于应用程序定期运行,因此没有必要检查目录中找到的所有文件是否存在错误,我们只希望自应用程序上次运行以来已创建或更新的文件。

这种设计的思想是将同一个接口的多个实现组合在一起,创建一个负责验证文件的聚合对象。 鹰眼的读者会注意到,这是Delegate Pattern的实现。

屏幕+拍摄+ 2014-03-08 + at + 16.59.55

在上面的类图中,将RegexValidatorFileAgeValidator实例注入FileValidator ,并将其验证任务委托给这些类。

依次轮流使用它们并首先处理Validator接口…

public interface Validator { /** The validation method */ public <T> boolean validate(T obj); }

上面的代码演示了Validator接口的简单性。 它具有单个方法validate(T obj) ,这是一个泛型方法调用,可以提高此接口的灵活性和可重用性。 当类实现此接口时,它们可以更改输入参数类型以适合自己的目的……如下面的第一个实现所示:

public class RegexValidator implements Validator { private static final Logger logger = LoggerFactory.getLogger(RegexValidator.class); private final Pattern pattern; public RegexValidator(String regex) { pattern = Pattern.compile(regex); logger.info("loaded regex: {}", regex); } @Override public <T> boolean validate(T string) { boolean retVal = false; Matcher matcher = pattern.matcher((String) string); retVal = matcher.matches(); if (retVal && logger.isDebugEnabled()) { logger.debug("Found error line: {}", string); } return retVal; } 
}

RegexValidator类具有采用正则表达式字符串的单个参数构造函数。 然后将其转换为Pattern实例变量,并由validate(T string)方法使用它来测试String输入参数是否与原始构造函数arg正则表达式匹配。 如果是这样,那么validate(T string)将返回true。

@Service 
public class FileAgeValidator implements Validator { @Value("${max.days}") private int maxDays; /** * Validate the age of the file. * * @see com.captaindebug.errortrack.Validator#validate(java.lang.Object) */ @Override public <T> boolean validate(T obj) { File file = (File) obj; Calendar fileDate = getFileDate(file); Calendar ageLimit = getFileAgeLimit(); boolean retVal = false; if (fileDate.after(ageLimit)) { retVal = true; } return retVal; } private Calendar getFileAgeLimit() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_MONTH, -1 * maxDays); return cal; } private Calendar getFileDate(File file) { long fileDate = file.lastModified(); Calendar when = Calendar.getInstance(); when.setTimeInMillis(fileDate); return when; } }

第二个Validator(T obj)实现是FileAgeValidator显示的FileAgeValidator ,要注意的第一件事是整个过程由max.days属性驱动。 这被注入到FileAgeValidator@Value注释的maxDays实例变量中。 此变量确定文件的最长期限(天)。 该文件早于该值,然后validate(T obj)将返回false。

在此实现中, validate(T obj) 'obj'参数被强制转换为File对象,然后将其用于将文件的日期转换为Calendar对象。 下一行代码将maxDays变量转换为第二个Calendar对象: ageLimit 。 然后将ageLimitfileDate对象进行比较。 如果fileDateageLimit之后,则validate(T obj)返回true。

validator程序包中的最后一个类是FileValidator ,如上所示,它将很多职责委托给其他三个聚合的验证程序:一个FileAgeValidator和两个RegexValidator

@Service 
public class FileValidator implements Validator { private static final Logger logger = LoggerFactory.getLogger(FileValidator.class); @Value("${following.lines}") private Integer extraLineCount; @Autowired @Qualifier("scan-for") private RegexValidator scanForValidator; @Autowired(required = false) @Qualifier("exclude") private RegexValidator excludeValidator; @Autowired private FileAgeValidator fileAgeValidator; @Autowired private Results results; @Override public <T> boolean validate(T obj) { boolean retVal = false; File file = (File) obj; if (fileAgeValidator.validate(file)) { results.addFile(file.getPath()); checkFile(file); retVal = true; } return retVal; } private void checkFile(File file) { try { BufferedReader in = createBufferedReader(file); readLines(in, file); in.close(); } catch (Exception e) { logger.error("Error whilst processing file: " + file.getPath() + " Message: " + e.getMessage(), e); } } @VisibleForTesting BufferedReader createBufferedReader(File file) throws FileNotFoundException { BufferedReader in = new BufferedReader(new FileReader(file)); return in; } private void readLines(BufferedReader in, File file) throws IOException { int lineNumber = 0; String line; do { line = in.readLine(); if (isNotNull(line)) { processLine(line, file.getPath(), ++lineNumber, in); } } while (isNotNull(line)); } private boolean isNotNull(Object obj) { return obj != null; } private int processLine(String line, String filePath, int lineNumber, BufferedReader in) throws IOException { if (canValidateLine(line) && scanForValidator.validate(line)) { List<String> lines = new ArrayList<String>(); lines.add(line); addExtraDetailLines(in, lines); results.addResult(filePath, lineNumber, lines); lineNumber += extraLineCount; } return lineNumber; } private boolean canValidateLine(String line) { boolean retVal = true; if (isNotNull(excludeValidator)) { retVal = !excludeValidator.validate(line); } return retVal; } private void addExtraDetailLines(BufferedReader in, List<String> lines) throws IOException { for (int i = 0; i < extraLineCount; i++) { String line = in.readLine(); if (isNotNull(line)) { lines.add(line); } else { break; } } } }

FileValidatorvalidate(T obj)File作为参数。 它的首要职责是验证文件的年龄。 如果该验证器返回true,则它通知Report类它已找到一个新的有效文件。 然后,它检查文件中是否有错误,并将找到的任何内容添加到Report实例。 它通过使用BufferedReader依次检查文件的每一行来做到这一点。 在检查某行是否包含错误之前,它会检查该行是否未从检查中排除-即,它与排除的异常或我们不感兴趣的异常不匹配。如果该行与排除的异常不匹配异常,然后使用RegexValidator的第二个实例检查是否需要查找异常。 如果该行确实包含错误,则会将其添加到List<String>对象。 然后从添加到列表的文件中读取以下几行,以使报告更具可读性。

因此,文件解析将继续进行,一次检查每一行以查找错误并建立报告,以便稍后进行处理。

该封面的验证文件使用委托模式添加了发现到Report任何异常,但是此Report对象如何工作? 我没有提到它,输出是如何产生的? 下次再说。

  • 该博客的代码可在Github上找到: https : //github.com/roghughe/captaindebug/tree/master/error-track 。

参考: 使用Spring跟踪异常–第2部分–在Captain Debug的Blog博客上,从我们的JCG合作伙伴 Roger Hughes 委托模式 。

翻译自: https://www.javacodegeeks.com/2014/03/tracking-exceptions-with-spring-part-2-delegate-pattern.html

spring 异常捕获异常

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

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

相关文章

LoRa在智能家居当中的物联网应用

一、智能家居行业背景 原文地址&#xff1a;LoRa在智能家居当中的应用 2020年&#xff0c;中国智能家居进入AIoT赋能期&#xff0c;全面革新智能家居产品形态。从市场规模来看&#xff0c;2019年智能家居市场规模达到1530亿元左右&#xff0c;2020年将达1820亿元。从设备出货量…

飞畅科技-国内老牌工业以太网交换机品牌

现如今&#xff0c;随着中国制造2025和工业4.0的逐渐展开&#xff0c;工业交换机的市场越来越大&#xff0c;尤其是在电力&#xff0c;交通&#xff0c;及工业自动化行业&#xff0c;但是进口品牌的在国内的份额却在不断的萎缩&#xff0c;这就给国内的很多工业交换机厂家一个非…

物联网是什么?物联网的关键技术是什么?

物联网是从应用出发&#xff0c;利用互联网、无线通信网络资源进行业务信息的传送&#xff0c;是互联网、移动通信网应用的延伸&#xff0c;是自动化控制、遥控遥测及信息应用技术的综合体现。 信息革命浪潮。物联网已经在全世界得到了很大的重视&#xff0c;随着“物联网十二五…

通过Java Hipster升级Spring Security OAuth和JUnit测试

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 使用单元测试和集成测试来验证代码质量是一种很好的方式来表明您对代码的关心。 我最…

核心交换机与汇聚交换机的区别

核心交换机并不是交换机的一种类型&#xff0c;放在核心层(网络主干部分)的交换机叫核心交换机。汇聚层交换机&#xff0c;是多台接入层交换机的汇聚地点。汇聚层交换机和核心交换机在功能、特性、参数、场景等都是有所区别。接下来我们就详细介绍下核心交换机、汇聚交换机、普…

TCP服务器虚拟串口工具的MCGS开发调试教程

TCP服务器虚拟串口&#xff08;Modbus RTU&#xff09; 虚拟串口的方式不同&#xff0c;虚拟从机的连接方式也就不同&#xff0c;利用虚拟串口的TCP服务器模式虚拟串口1&#xff08;COM1&#xff09;如下&#xff1a; MCGS配置不用修改&#xff0c;只需配置仿真从机&#xff0…

虚拟串口工具MCGS开发调试的灵活应用教程

MCGS开发调试一般来说具有三种方式&#xff0c;如下所述&#xff1a; &#xff08;1&#xff09;选择使用模拟设备&#xff0c;一般来说无法直接在电脑上调试真实设备&#xff08;不带以太网型号&#xff09;&#xff0c;需要通过USB转485设备中转实现&#xff0c;在调试完成需…

工业级环网交换机是做什么的?

什么是环网交换机&#xff1a; 环网交换机是一种特殊的交换机&#xff0c;因为主流的环网交换机均为工业交换机&#xff0c;因此一般可以将其称为工业级环网交换机&#xff0c;环网交换在环网结构上有很多的优点&#xff0c;比如有冗余性、可靠性等。 环网交换机可以组建环形网…

MCGS嵌入软件配置教程

设备驱动与变量定义 为了节省流量采用手动发送&#xff0c;因此不能使用官方驱动&#xff0c;需要使用用户自定义驱动&#xff0c;这里提供百度网盘下载地址&#xff08;见评论区&#xff09;。链接&#xff1a;https://pan.baidu.com/s/1ORy2UFOlHeRCXraYKC1xUA 提取码&#…

Apache Ranger插件的美丽简洁

如果您在这里&#xff0c;您已经知道什么是Apache Ranger 。 它是管理Hadoop框架中安全性的最流行&#xff08;即使不是唯一&#xff09;的方法。 它与Active Directory&#xff0c;Kerberos和其他各种身份验证集成在一起&#xff0c;但是我认为最有趣的功能是其授权支持。 作为…

交换机出现电源故障怎么解决?

现如今&#xff0c;随着信息化的飞速发展&#xff0c;工业交换机作为信息流通的承载者&#xff0c;可以说是应用最为广泛的网络设备之一&#xff0c;其作用不言而喻&#xff0c;因此工业交换机的选择是十分重要的。但是工业交换机在长期运行过程中&#xff0c;难免会出现一些故…

MCGS用户程序云端授权系统设计

MCGS用户程序云端授权系统设计 基于HTTP请求通过外接串口服务器实现MCGS组态屏&#xff08;TPC7062Ti&#xff09;云端授权系统搭建&#xff0c;重点讲解如何实现系统对时&#xff08;基于UDP协议的NTP对时协议&#xff09;、加密算法的选择、加密算法的设计与实现。 算法实现…

「技术」室内定位—AOA测距算法,定位精度可达1m

什么是AOA测距&#xff1f; 到达角度测距(Angle-of-Arrival&#xff1a;AOA)&#xff1a;基于信号到达角度的定位算法是典型的、基于测距的定位算法&#xff0c;在无线传感网络应用中&#xff0c;AOA&#xff08;到达角度测距&#xff09;作为网络节点自定位一种常见的定位算法…

飞畅科技-交换机的三种交换方式详解

交换机是一种用于电&#xff08;光&#xff09;信号转发的网络设备&#xff0c;它可以为接入交换机的任意两个网络节点提供独享的电信号通路。交换机拥有一条高带宽的背部总线和内部交换矩阵&#xff0c;在同一时刻可进行多个端口对之间的数据传输&#xff0c;交换机的传输模式…

MCGS组态屏通过E90-DTU数传电台实现PLC远程控制

一&#xff0e;案例简介 通过使用成都亿佰特电子科技有限公司开发的E90-DTU(230SL30-ETH)_V2.0结合E90-DTU(230SL30)实现串口屏远程控制PLC。 二&#xff0e;硬件准备 昆仑通态&#xff08;MCGS&#xff09;-TPC7062(TX)串口控制屏&#xff1b; 施耐德TM221系列PLC&#xf…

交换机的作用是什么?交换机功能及工作原理详解!

交换机有多个端口&#xff0c;每个端口都具有桥接功能&#xff0c;可以连接一个局域网或一台高性能服务器或工作站。实际上&#xff0c;交换机有时被称为多端口网桥。那么&#xff0c;交换机的作用是什么&#xff1f;交换机的功能及工作原理是什么&#xff1f;接下来我们就一起…

数传电台实现PLC远程控制中MCGS参数配置与查询

1、施耐德PLC 施耐德IPv4参数查询以及是否能使Modbus Server&#xff0c;通过查询TM221手册可获取端口为502&#xff0c;不同的PLC端口可能不同&#xff0c;一般公司都将502作为Modbus Serve默认端口。 2.串口屏&#xff08;MCGS组态屏&#xff09; 打开MCGS嵌入版软件&#…

使用Apache JMeter负载测试Web应用程序

Apache JMeter是模拟网络应用程序上的用户负载以测试性能的出色工具。 您可以通过指定用户数量和请求之间的时间间隔轻松地构建测试计划&#xff0c;然后JMeter将为每个用户生成一个线程并访问您的Web应用程序。 在测试结束时&#xff0c;您将获得一份性能摘要报告&#xff0c;…

IoT物联网无线通信模块该如何选择?

目前大多数物联网&#xff08;IoT&#xff09;的节点都是使用ZigBee技术来进行组网的&#xff0c;然后通过gateway&#xff08;网关&#xff09;来连接网络。但是ZigBee模块的优势并不明显&#xff0c;也有很多公司正在开发新的无线模块来代替它&#xff0c;例如lora模块、蓝牙…

交换机端口故障问题解决方法

工业交换机可以说是工业安防工程中很重要的一款设备&#xff0c;在网名使用工业交换机的过程中&#xff0c;难免会遇到一些故障问题&#xff0c;在这其中工业交换机的端口故障可以说是是最常见的硬件故障&#xff0c;无论是光纤端口还是双绞线的RJ-45端口&#xff0c;在插拔接头…