SpringSecurity学习之路4-利用多线程提高Restful服务性能

知识点一:使用Runnerable异步处理Restful服务

知识点二:使用DeferredRestful异步处理Restful服务

同步处理逻辑如下:

SpringSecurity学习之路4-利用多线程提高Restful服务性能_第1张图片

假如要处理创建订单的请求,如上图所示,采用同步方式时,吞吐率无疑很低。

异步处理逻辑如下:

SpringSecurity学习之路4-利用多线程提高Restful服务性能_第2张图片

通过主线程调用副(子)线程的方式,能够提高系统的吞吐率。这种方式很直观,也很简单。实现代码如下:

SpringSecurity学习之路4-利用多线程提高Restful服务性能_第3张图片

执行后控制台输出结果

通过控制台输出的日志信息我们可以看到,主线程会先结束,而不是等到子线程处理完再结束。对于这些变化,前台不会感知到。 

实际的企业级开发中会比这种情况要复杂的多,看下面的图:

SpringSecurity学习之路4-利用多线程提高Restful服务性能_第4张图片 DeferredResult异步处理Restful服务

上图很清楚的表达了这种处理方式。在此简单实现上图逻辑,只是模拟。

步骤一:往模拟的消息队列MockSeque中存放订单,

步骤二:监听到订单处理完成,返回处理结果

MockSeque模拟消息队列和订单的处理

SpringSecurity学习之路4-利用多线程提高Restful服务性能_第5张图片

QueueListener是监听器,负责监听completeOrder的值,

@Component
public class QueueListener implements ApplicationListener {
	@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();
	}
}

主线程:

SpringSecurity学习之路4-利用多线程提高Restful服务性能_第6张图片

运行结构如下:

 

至此,关于使用多线程来提高Restful服务性能的介绍完毕。

你可能感兴趣的:(java,spring,SpringSecurity)