servlet3.0使用

博客围绕异步Servlet展开,虽未给出具体内容,但可推测会涉及异步Servlet的原理、应用等信息技术相关内容。异步Servlet在后端开发中能提升性能和响应能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


异步servlet使用 基于springboot


@WebServlet(urlPatterns = "/address", asyncSupported = true)
public class ServletAsync extends HttpServlet {

    private static Logger logger = Logger.getLogger(ServletAsync.class);

    private Gson gson = new Gson();

    private final static int permits = 200;

    private Semaphore semaphore = new Semaphore(permits);

    private static ThreadPoolExecutor executor = null;

    static {
        executor = new ThreadPoolExecutor(80, 100, 60L, TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(100),
                new ThreadFactory("theard-1"),
                new RejectedExecutionHandler() {
                    @Override
                    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                        try {
                            Processor process = (Processor ) r;
                            process.writerError("系统繁忙,请稍后再试!");
                            //这里直接处理不重新入队列
                            process.getAsyncContext().complete();
                        } catch (Throwable e) {
                            logger.error("--RejectedExecutionHandler-->", e);
                        }
                    }
                });
    }

    @Override
    public void destroy() {
        super.destroy();
        executor.shutdown();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json;charset=utf-8");

        //写业务代码
      
        //结束
    
        if (executor.getActiveCount() > permits) {
            Result orr = new Result (false, "-1", "xxxxxx");
            response.getWriter().write(gson.toJson(orr));
            return;
        } else if (semaphore.tryAcquire()) {
            try {
                request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);
                AsyncContext asyncCtx = request.startAsync();
                // 设置回调监听器
                asyncCtx.addListener(new AsyncListener() {
                    @Override
                    public void onComplete(AsyncEvent event) throws IOException {
                        long end = System.currentTimeMillis();
                        logger.info("调用总耗时:" + (end - start) + "ms");
                    }

                    @Override
                    public void onTimeout(AsyncEvent event) throws IOException {
                        ServletResponse response = event.getAsyncContext().getResponse();
                        PrintWriter out = response.getWriter();
                        Result orr = new Result (false, "-1", "cainiao timeout 2s");
                        out.write(gson.toJson(orr));
                        out.flush();
                        out.close();
                    }

                    @Override
                    public void onError(AsyncEvent event) throws IOException {
                        ServletResponse response = event.getAsyncContext().getResponse();
                        PrintWriter out = response.getWriter();
                        Result orr = new Result (false, "-1", "cainiao system error");
                        out.write(gson.toJson(orr));
                        out.flush();
                        out.close();
                    }

                    @Override
                    public void onStartAsync(AsyncEvent event) throws IOException {

                    }
                });
                //设置超时时间
                asyncCtx.setTimeout(6000);
                executor.execute(new Processor(asyncCtx, req));
            } finally {
                //释放
                semaphore.release();
            }
        } else {
            Result rr= new Result(false, "-1", "XXXXX");
            response.getWriter().write(gson.toJson(rr));
            return;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值