加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

后端开拓实践系列——Spring Boot项目模板

发布时间:2019-07-27 00:34:53 所属栏目:建站 来源:无知者云
导读:在我的事变中,我从零开始搭建了不少软件项目,个中包括了基本代码框架和一连集成基本办法等,这些内容在火速开拓中凡是被称为第0个迭代要做的工作。可是,当项目运行了一段时刻之后再来反观,我总会发明一些不敷的处所,要么测试分类没有分好,要么根基的

在计划非常处理赏罚的框架时,必要思量以下几点:

  • 向客户端提供名目同一的非常返回
  • 非常信息中应该包括足够多的上下文信息,最好是布局化的数据以便于客户端理会
  • 差异范例的非常应该包括独一标识,以便客户端准确辨认

非常处理赏罚凡是有两种情势,一种是层级式的,即每种详细的非常都对应了一个非常类,这些类最终担任自某个父非常;另一种是单一式的,即整个措施中只有一个非常类,再以一个字段来区分差异的非常场景。层级式非常的甜头是可以或许显式化非常寄义,可是假如层级计划欠好也许导致整个措施中充斥着大量的非常类;单一式的甜头是简朴,而其弱点在于表意性不足。

本文的示例项目行使了层级式非常,全部非常都担任自一个AppException:

  1. public abstract class AppException extends RuntimeException { 
  2.     private final ErrorCode code; 
  3.     private final Map<String, Object> data = newHashMap(); 

这里,ErrorCode列举中包括了非常的独一标识、HTTP状态码以及错误信息;而data字段暗示各个非常的上下文信息。

在示例体系中,在没有找到订单时抛出非常:

  1. public class OrderNotFoundException extends AppException { 
  2.     public OrderNotFoundException(OrderId orderId) { 
  3.         super(ErrorCode.ORDER_NOT_FOUND, ImmutableMap.of("orderId", orderId.toString())); 
  4.     } 

在返回非常给客户端时,通过一个ErrorDetail类来同一非常名目:

  1. public final class ErrorDetail { 
  2.     private final ErrorCode code; 
  3.     private final int status; 
  4.     private final String message; 
  5.     private final String path; 
  6.     private final Instant timestamp; 
  7.     private final Map<String, Object> data = newHashMap(); 

最终返回客户端的数据为:

  1.   requestId: "d008ef46bb4f4cf19c9081ad50df33bd", 
  2.   error: { 
  3.     code: "ORDER_NOT_FOUND", 
  4.     status: 404, 
  5.     message: "没有找到订单", 
  6.     path: "/order", 
  7.     timestamp: 1555031270087, 
  8.     data: { 
  9.       orderId: "123456789" 
  10.     } 
  11.   } 

可以看到,ORDER_NOT_FOUND与data中的数据布局是逐一对应的,也即对付客户端来讲,假如发明白ORDER_NOT_FOUND,那么便可确定data中必然存在orderId字段,进而完成准确的布局化理会。

靠山使命与漫衍式锁

除了即时完成客户端的哀求外,体系中凡是会有一些按时性的例利用命,好比按期地向用户发送邮件可能运行数据报表等;其它,偶然从计划上我们会对哀求举办异步化处理赏罚。此时,我们必要搭建靠山使命相干基本办法。Spring原生提供了使命处理赏罚(TaskExecutor)和使命打算(TaskSchedulor)机制;而在漫衍式场景下,还必要引入漫衍式锁来办理并发斗嘴,为此我们引入一个轻量级的漫衍式锁框架ShedLock。

启用Spring使命设置如下:

  1. @Configuration 
  2. @EnableAsync 
  3. @EnableScheduling 
  4. public class SchedulingConfiguration implements SchedulingConfigurer { 
  5.  
  6.     @Override 
  7.     public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 
  8.         taskRegistrar.setScheduler(newScheduledThreadPool(10)); 
  9.     } 
  10.  
  11.     @Bean(destroyMethod = "shutdown") 
  12.     @Primary 
  13.     public TaskExecutor taskExecutor() { 
  14.         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
  15.         executor.setCorePoolSize(2); 
  16.         executor.setMaxPoolSize(5); 
  17.         executor.setQueueCapacity(10); 
  18.         executor.setTaskDecorator(new LogbackMdcTaskDecorator()); 
  19.         executor.initialize(); 
  20.         return executor; 
  21.     } 
  22.  

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读