Web服务请求的几种异步处理方式

我们先通过下面两张图来看下网络Web请求的异步处理和同步请求处理的区别:

在上面两个流程图中有三个角色:客户端、Web容器和 业务后端服务

两个流程中客户端对Web容器的请求,都是同步的。因为它们在请求客户端时都处于阻塞等待状态(涉及到用户态和内核态的切换),并没有进行异步处理。

在Web容器部分,第一个流程采用同步请求,第二个流程采用异步回调的形式。

通过异步处理,可以先释放容器分配给请求的线程与相关资源,减轻系统负担,从而增加了Web服务器对客户端请求的吞吐量。但并发请求量较大时,也通常要配合通过负载均衡的方案来解决,而不只是异步。

1、基于Servlet方式实现异步请求

下面是一个基于Servlet方式的异步请求示例:

@GetMapping(value = "/user/get")
public void servletReq(HttpServletRequest request) {
AsyncContext asyncContext = request.startAsync();
// 设置监听器:可设置其开始、完成、异常、超时等事件的回调处理
asyncContext.addListener(new AsyncListener() {
    @Override
    public void onTimeout(AsyncEvent event) {
        System.out.println("处理超时了...");
    }

    @Override
    public void onStartAsync(AsyncEvent event) {
        System.out.println("线程开始执行");
    }

    @Override
    public void onError(AsyncEvent event) {
        System.out.println("执行过程中发生错误:" + event.getThrowable().getMessage());
    }

    @Override
    public void onComplete(AsyncEvent event) {
        System.out.println("执行完成,释放资源");
    }
});
//设置超时时间
asyncContext.setTimeout(6000);
asyncContext.start(new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(5000);
            System.out.println("内部线程:" + Thread.currentThread().getName());
            asyncContext.getResponse().getWriter().println("async processing");
        } catch (Exception e) {
            System.out.println("异步处理发生异常:" + e.getMessage());
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值