ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

【Java 脚手架】封装通用工具类-2

【Java 脚手架】封装通用工具类-2 统一异常处理自动装配Spring Boot 的自动装配核心是把约定大于配置做到极致。引一个 starterSpring Boot 就把常用 bean 配好了基本不用写配置。关键在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports这个文件里面写了要加载的配置类。启动时 Spring 会扫描这些文件然后有一些列的注解辅助比如Conditional系列注解控制是否生效比如ConditionalOnClassclasspath 有这个类才生效ConditionalOnMissingBean容器里没有这个 bean 才注册。我在脚手架里的全局异常处理就是用这个思想。做成了一个 starter其他微服务引入依赖异常处理器就自动生效了。好处不只是少写代码重要的是统一所有微服务用同一套异常格式、处理逻辑接口规范一致。写时遇到的问题字符串获取失败写网关异常处理时写了个 filter 手动抛出异常检测是否能被捕获到OverridepublicMonoVoidfilter(ServerWebExchangeexchange,GatewayFilterChainchain){thrownewServiceException(网关过滤器异常捕获测试,EnumCode.URL_NOT_FOUND.getCode());}在 Postman 能看到是被正常捕获的但是返回的 msg 丢失了与预期返回的字符串不符合。我就 debug 看看发现是在全局异常处理的时候得到的异常 ex 获取字符串的方式错误了定位如下通过 debug 可以看出 retMsg 在经过 ex.getMessage() 后得到的是空值原本的默认值也被覆盖了。点击进一级看原来是获取 Throwable 的 msg并不是自定义异常的 msg。强转成自定义异常后再 get 到正确的字符串问题就解决了状态也能正常响应线程池线程池类选择考虑采用 Spring 对 Java 的线程池类进一步封装的ThreadPoolTaskExecutor因为本身脚手架是 Spring 项目且 Spring 封装的线程池类能够更方便的对线程池的一些配置进行修改且设计初衷需要满足 nacos 动态配置的要求所以用ThreadPoolTaskExecutor就非常的合适。策略模式在线程池满载时系统必须定义拒绝任务的处理方式。在选择拒绝任务的处理方式时必须要创建一个 RejectedExecutionHandler 对象提供方式但是直接内部手动实现这种对象会很繁琐所以就是用策略模式了。我把策略选择外置到配置项通过RejectType getRejectHandler() 在运行时装配体现了策略模式。当前默认配置是rejectHandler:2对应 CallerRunsPolicy默认使用 CallerRunsPolicy 的好处是在高并发下通过调用方线程执行任务来产生背压避免盲目丢任务或直接失败从而提升系统稳定性。
返回列表