当前位置: 首页 > news >正文

福田网站建设方案软件工程课程设计

福田网站建设方案,软件工程课程设计,中国网络排名前十名,wordpress怎么上传源代码方案介绍 将异常信息放在日志里面,如果磁盘定期清理,会导致很久之前的日志丢失,因此考虑将日志中的异常信息存在表里,方便后期查看定位问题。 由于项目是基于SpringBoot构架的,所以采用AdviceControllerExceptionHand…

方案介绍

将异常信息放在日志里面,如果磁盘定期清理,会导致很久之前的日志丢失,因此考虑将日志中的异常信息存在表里,方便后期查看定位问题。
由于项目是基于SpringBoot构架的,所以采用@AdviceController+@ExceptionHandler对全局异常进行拦截和处理,而后将异常信息通过异步任务的方式记录到数据库,之所以采用异步任务,是防止异常记录出现问题影响主流程:

@AdviceController+@ExceptionHandler拦截
发生异常
处理异常返回信息
异步记录异常堆栈信息
结束

方案实现

定义异常处理表

CREATE TABLE exception_log_t (id int(10) NOT NULL AUTO_INCREMENT COMMENT '主键id',msg varchar(1024) NOT NULL COMMENT '异常信息',stack_trace text DEFAULT NULL COMMENT '异常堆栈信息',create_by bigint(10) DEFAULT NULL COMMENT '创建人',creation_date datetime NOT NULL COMMENT '异常发生时间',PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='异常信息日志表';

GlobalExceptionHandler带有@ControllerAdvice和@ExceptionHandler注解,可以拦截异常并处理,同时组装异常记录信息给异步任务进行记录

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {/*** 处理自定义异常*/@ExceptionHandler(value = CommonException.class)@ResponseBodypublic BasicResponse bizExceptionHandler(CommonException e) {log.error("CommonException error info:", e);recordExceptionMsg(e);return BasicResponse.commonError(e);}/*** 处理其他异常*/@ExceptionHandler(value = Exception.class)@ResponseBodypublic BasicResponse exceptionHandler(Exception e) {log.error("Exception error info:", e);recordExceptionMsg(e);return BasicResponse.errorWithMsg(e.getMessage());}/*** 处理自定义异常*/@ExceptionHandler(value = IllegalStateException.class)@ResponseBodypublic BasicResponse IllegalStateExceptionHandler(IllegalStateException e) {log.error("IllegalStateException error info:", e);recordExceptionMsg(e);return BasicResponse.errorWithMsg(e.getMessage());}/*** 处理NoSuchAlgorithmException异常*/@ExceptionHandler(value = NoSuchAlgorithmException.class)@ResponseBodypublic BasicResponse NoSuchAlgorithmExceptionHandler(NoSuchAlgorithmException e) {log.error("NoSuchAlgorithmException error info:", e);recordExceptionMsg(e);return BasicResponse.errorWithMsg(e.getMessage());}/*** 组装异常记录信息*/private <T extends Exception> void recordExceptionMsg(T ex) {String exStackTrace = "";try {exStackTrace = getExStackTrace(ex);} catch (IOException e) {log.error("get exception stack track info error:", e);}String message = ex.getMessage();if (message.length() > 1024) {message = message.substring(0, 1024);}ExceptionMsgPo exceptionMsgPo = ExceptionMsgPo.builder().msg(message).stackTrace(exStackTrace).creationDate(new Date()).createBy(UserContext.getUserId()).build();AsyncRecordExceptionMsg asyncRecordExMsg = AppContextUtil.getBean(AsyncRecordExceptionMsg.class);// 调用异步任务入库asyncRecordExMsg.recordExceptionMsgTask(exceptionMsgPo);}private <T extends Exception> String getExStackTrace(T ex) throws IOException {//读取异常堆栈信息ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();ex.printStackTrace(new PrintStream(arrayOutputStream));//通过字节数组转换输入输出流BufferedReader fr = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(arrayOutputStream.toByteArray())));String str;StringBuilder exceptionSb = new StringBuilder();while ((str = fr.readLine()) != null) {exceptionSb.append(str);exceptionSb.append("\n");}return exceptionSb.toString();}
}

异步任务记录异常比较简单, 就调用IExceptionMsgMapper进行入库

@Component
@Slf4j
public class AsyncRecordExceptionMsg {@Autowiredprivate IExceptionMsgMapper exceptionMsgMapper;@Async("asyncPoolTaskExecutor")public void recordExceptionMsgTask(ExceptionMsgPo exceptionMsgPo){log.info("begin to do recordExceptionMsgTask");exceptionMsgMapper.insert(exceptionMsgPo);log.info("end of recordExceptionMsgTask");}
}

需要注意的是,@Async异步任务虽然方便,但是要注意控制线程数量,避免线程耗尽资源, @Async("asyncPoolTaskExecutor")中的asyncPoolTaskExecutor将线程池定义如下:

@Configuration
@EnableAsync
public class SyncConfiguration {@Bean(name = "asyncPoolTaskExecutor")public ThreadPoolTaskExecutor executor() {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();//核心线程数taskExecutor.setCorePoolSize(10);//线程池维护线程的最大数量,只有在缓冲队列满了之后才会申请超过核心线程数的线程taskExecutor.setMaxPoolSize(100);//缓存队列taskExecutor.setQueueCapacity(50);//许的空闲时间,当超过了核心线程出之外的线程在空闲时间到达之后会被销毁taskExecutor.setKeepAliveSeconds(200);//异步方法内部线程名称taskExecutor.setThreadNamePrefix("async-task-");/*** 当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略* 通常有以下四种策略:* ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。* ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。* ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)* ThreadPoolExecutor.CallerRunsPolicy:重试添加当前的任务,自动重复调用 execute() 方法,直到成功*/taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());taskExecutor.initialize();return taskExecutor;}
}

ExceptionMsgPo定义

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName("exception_log_t")
public class ExceptionMsgPo {@TableId(value="id",type = IdType.AUTO)private Long id;@TableField("msg")private String msg;@TableField("stack_trace")private String stackTrace;@TableField("create_by")protected Long createBy;@TableField("creation_date")@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date creationDate;
}

测试效果

应用抛出异常,记录
在这里插入图片描述

http://www.yayakq.cn/news/897366/

相关文章:

  • 商务网站开发的流程免费获取资源的公众号
  • 网站建设三网公司网站建设服务费计入什么科目
  • 做十个网站北京网站建设上石榴汇
  • 网站建设需要做哪些工作想建立自己的网站怎么建立
  • dtcms网站开发教程网站建设代码模板
  • 做软装设计能用到的网站有哪些网站建设招标
  • 哪个公司做网站优推宝可以做自己网站吗
  • 做网站ps笔记本电脑网站开发的基本功能
  • 网站模板怎么使用网页设计与网站建设 郑州大学
  • 萧山做网站h5的制作步骤
  • 建设牌安全带厂家网站网页设计个人简历代码
  • 公司手机网站建设深圳网站开发怎么样
  • 网站建设酷万网络互联网招聘网站排行
  • 天津网站排名优化苏州网站营销公司简介
  • 淘宝联盟做网站深圳餐饮网站建设
  • 做网站最快多久网站 手机 微信 app
  • 网页代理网站如何申请网站备案号
  • 建筑公司网站源码开源建设手机网站的公司
  • 做的好的网站有哪些做美容网站公司
  • 网站开发_去哪里找页面建设网站需要分析什么
  • 广西自治区住房城乡建设部网站易风网站建设
  • 四川住建厅官方网站的网址南宁网站建设清单
  • 中山快速做网站价格秦皇岛网站制作代理商
  • 一个静态网站开发考虑什么wordpress做商城好吗
  • 廊坊网站排名方案google网站管理员中心
  • 怀柔青岛网站建设花灯彩灯制作公司
  • 滁州网站建设php毕业设计二手网站怎么做
  • 网站设计与实现毕业设计建站助手官网
  • 郑州高端模板建站国内免费推广产品的网站
  • jsp 响应式网站模板上海做网站品牌公司