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

12 篇文章 0 订阅
2 篇文章 0 订阅

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

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

同步处理逻辑如下:

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

异步处理逻辑如下:

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

执行后控制台输出结果

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

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

DeferredResult异步处理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服务性能的介绍完毕。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值