在计划非常处理赏罚的框架时,必要思量以下几点:
- 向客户端提供名目同一的非常返回
- 非常信息中应该包括足够多的上下文信息,最好是布局化的数据以便于客户端理会
- 差异范例的非常应该包括独一标识,以便客户端准确辨认
非常处理赏罚凡是有两种情势,一种是层级式的,即每种详细的非常都对应了一个非常类,这些类最终担任自某个父非常;另一种是单一式的,即整个措施中只有一个非常类,再以一个字段来区分差异的非常场景。层级式非常的甜头是可以或许显式化非常寄义,可是假如层级计划欠好也许导致整个措施中充斥着大量的非常类;单一式的甜头是简朴,而其弱点在于表意性不足。
本文的示例项目行使了层级式非常,全部非常都担任自一个AppException:
- public abstract class AppException extends RuntimeException {
- private final ErrorCode code;
- private final Map<String, Object> data = newHashMap();
- }
这里,ErrorCode列举中包括了非常的独一标识、HTTP状态码以及错误信息;而data字段暗示各个非常的上下文信息。
在示例体系中,在没有找到订单时抛出非常:
- public class OrderNotFoundException extends AppException {
- public OrderNotFoundException(OrderId orderId) {
- super(ErrorCode.ORDER_NOT_FOUND, ImmutableMap.of("orderId", orderId.toString()));
- }
- }
在返回非常给客户端时,通过一个ErrorDetail类来同一非常名目:
- public final class ErrorDetail {
- private final ErrorCode code;
- private final int status;
- private final String message;
- private final String path;
- private final Instant timestamp;
- private final Map<String, Object> data = newHashMap();
- }
最终返回客户端的数据为:
- {
- requestId: "d008ef46bb4f4cf19c9081ad50df33bd",
- error: {
- code: "ORDER_NOT_FOUND",
- status: 404,
- message: "没有找到订单",
- path: "/order",
- timestamp: 1555031270087,
- data: {
- orderId: "123456789"
- }
- }
- }
可以看到,ORDER_NOT_FOUND与data中的数据布局是逐一对应的,也即对付客户端来讲,假如发明白ORDER_NOT_FOUND,那么便可确定data中必然存在orderId字段,进而完成准确的布局化理会。
靠山使命与漫衍式锁
除了即时完成客户端的哀求外,体系中凡是会有一些按时性的例利用命,好比按期地向用户发送邮件可能运行数据报表等;其它,偶然从计划上我们会对哀求举办异步化处理赏罚。此时,我们必要搭建靠山使命相干基本办法。Spring原生提供了使命处理赏罚(TaskExecutor)和使命打算(TaskSchedulor)机制;而在漫衍式场景下,还必要引入漫衍式锁来办理并发斗嘴,为此我们引入一个轻量级的漫衍式锁框架ShedLock。
启用Spring使命设置如下:
- @Configuration
- @EnableAsync
- @EnableScheduling
- public class SchedulingConfiguration implements SchedulingConfigurer {
-
- @Override
- public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
- taskRegistrar.setScheduler(newScheduledThreadPool(10));
- }
-
- @Bean(destroyMethod = "shutdown")
- @Primary
- public TaskExecutor taskExecutor() {
- ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
- executor.setCorePoolSize(2);
- executor.setMaxPoolSize(5);
- executor.setQueueCapacity(10);
- executor.setTaskDecorator(new LogbackMdcTaskDecorator());
- executor.initialize();
- return executor;
- }
-
- }
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|