知识点一:使用Runnerable异步处理Restful服务
知识点二:使用DeferredRestful异步处理Restful服务
同步处理逻辑如下:
假如要处理创建订单的请求,如上图所示,采用同步方式时,吞吐率无疑很低。
异步处理逻辑如下:
通过主线程调用副(子)线程的方式,能够提高系统的吞吐率。这种方式很直观,也很简单。实现代码如下:
通过控制台输出的日志信息我们可以看到,主线程会先结束,而不是等到子线程处理完再结束。对于这些变化,前台不会感知到。
实际的企业级开发中会比这种情况要复杂的多,看下面的图:
上图很清楚的表达了这种处理方式。在此简单实现上图逻辑,只是模拟。
步骤一:往模拟的消息队列MockSeque中存放订单,
步骤二:监听到订单处理完成,返回处理结果
MockSeque模拟消息队列和订单的处理
QueueListener是监听器,负责监听completeOrder的值,
@Component
public class QueueListener implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
MockSeque mockSeque;
@Autowired
DeferredResultHolder deferredResultHolder;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// TODO Auto-generated method stub
new Thread(() -> {
while (true) {
if (StringUtils.isNotBlank(mockSeque.getCompleteOrder())) {
Logger logger = LoggerFactory.getLogger(getClass());
logger.info("订单处理完成" + mockSeque.getCompleteOrder());
String orderNumber = mockSeque.getCompleteOrder();
// 订单号为orderNumber的订单处理完成,返回信息为 order success
deferredResultHolder.getMap().get(orderNumber).setResult("order success");
mockSeque.setCompleteOrder(null);
} else {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
}
主线程:
运行结构如下:
至此,关于使用多线程来提高Restful服务性能的介绍完毕。