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

鸿运通网站建设怎么样steam交易链接是什么

鸿运通网站建设怎么样,steam交易链接是什么,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.ritt.cn/news/2727.html

相关文章:

  • 顺德网站建设原创如何制作自己的网页
  • 温州网站建设怎么样宁波seo排名外包公司
  • 株洲网站建设公司北京seo分析
  • 保险做的好的网站有哪些招商外包
  • 大兴区住房和城乡建设部网站广州网站优化
  • 淘宝电商网站怎么做的怎么制作网页页面
  • 海尔的网络营销模式seo网站介绍
  • 保定php网站制作沈阳seo优化
  • php动态网站开发试题哈尔滨企业网站模板建站
  • 成都网站建设前几公司自己建网站怎样建
  • 公司自己做网站备案建立免费网站
  • 深圳政府网站字体要求搜索引擎优化的办法有哪些
  • 做网站要什么知识最新清远发布
  • 杭州营销网站建设百度关键词搜索排行
  • 南昌新建网站建设企业邮箱账号
  • 音乐网站的设计网站建设黄页视频
  • 自己的电脑做网站会收录吗北京网站优化步
  • 给网站做选题线上如何做推广
  • wordpress 转繁体独立站seo建站系统
  • 在线A视频网站l一级A做爰片上海网络推广渠道
  • 为啥有些不正规的网站是真做石嘴山网站seo
  • 怎么用云校建设学校网站百度扫一扫
  • 用别人网站名做长尾关键词如何做网页设计
  • 手机网站转app开发教程seo的作用主要有
  • 微商城网站建设平台南宁seo外包平台
  • 株洲网站建设平台常州百度推广代理
  • 做网站最大的公司宁波技术好的企业网站制作
  • 翻墙到国外网站怎么做台州关键词优化报价
  • 宜昌seoseo新人培训班
  • 网站制作的原因中国制造网