IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

关于 Jetty Continuation

福林雨-博客 2010-12-30 22:49:17 累计浏览 3,539 次
本机暂存

领导说,我们不能绑定在某个产品,某个框架,某个技术实现上。所以当我们希望使用 jetty 的 continuation 技术的时候,我们必须对它进行一个包装,以保证将来如果需要,我们可以用其它的技术或框架进行替换。

一个简单的包装:

TaskManager 类:

以下是代码片段:
       /**
     * submit a task async
     *
     * @param request
     * @param response
     * @param task
     * @return result true for first submit task, false for expire or exception
     */
    public static boolean submitTask(final HttpServletRequest request,
            final HttpServletResponse response,
            final AbstractContinuation task) {
        final Continuation continuation = ContinuationSupport
                .getContinuation(request);

        if (continuation.isExpired()) {
            @SuppressWarnings("unchecked")
            final FutureTask ftask = (FutureTask) request
                    .getAttribute(TASK_FUTURE);
            if (ftask != null) {
                // not Interrupt if it is still running
                ftask.cancel(false);
            }
            task.onExpire(request, response);
            return false;
        }

        // first call of this request
        continuation.setTimeout(ContinuationConfig.timeout);
        continuation.suspend(response);

        try {
            final FutureTask ftask = new FutureTask(task) {
                @Override
                protected void done() {
                    // cancelled, just return
                    if (isCancelled()) {
                        return;
                    }
                    // expired, just return
                    if (continuation.isExpired()) {
                        return;
                    }

                    // complete, so *NO* attribute will take effects
                    // request.setAttribute(TASK_RESULTS, get());
                    try {
                        final Object result = get();
                        task.onResult(request, response, result);
                    } catch (final Exception e) {
                        task.onException(request, response, e);
                    }
                    continuation.complete();
                }
            };
            exec.submit(ftask);
            request.setAttribute(TASK_FUTURE, ftask);
            return true;
        } catch (final TooManyWaitingTaskException e) {
            task.onException(request, response, e);
            return false;
        }

    }

    /**
     * submit a task sync, with *NO* expire support
     *
     * @param request
     * @param response
     * @param task
     * @return result true for first submit task, false for expire or exception
     */
    public static boolean submitTask2(final HttpServletRequest request,
            final HttpServletResponse response,
            final AbstractContinuation task) {
        try {
            final Object result = task.call();
            task.onResult(request, response, result);
            return true;
        } catch (final TooManyWaitingTaskException e) {
            task.onException(request, response, e);
            return false;
        } catch (final Exception e) {
            task.onException(request, response, e);
            return false;
        }

    }

servlet 里面可以这样调用:(注意,当前不支持 jsp )

以下是代码片段:

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

        // create an asynchronous task
        final AbstractContinuation task = new AbstractContinuation() {
            @Override
            public Object call() throws Exception {
                // do the job
            }

            @Override
            public void onResult(final HttpServletRequest request,
                    final HttpServletResponse response, final Object result) {
                // has result, so ignore all exception
                                // do output
            }

            @Override
            public void onExpire(final HttpServletRequest request,
                    final HttpServletResponse response) {
                try {
                    response.sendError(504, "continuation job expired");
                    log.warn("on expire:" + request);
                } catch (final IOException e) {
                    log.warn("exception on expire: " + request + e.getMessage());
                }
                return;
            }

            @Override
            public void onException(final HttpServletRequest request,
                    final HttpServletResponse response, final Exception e) {
                try {
                    response.sendError(503, "some exception occured ");
                    log.warn("on exception:" + request, e);
                } catch (final IOException ioe) {
                    log.warn("exception on exception: " + request
                            + e.getMessage() + ioe.getMessage());
                }
                return;
            }
        };

        if (TaskManager.submitTask(request, response, task)) {
            // first submit
            // do nothing here
        } else {
            // expire, or exception
            // just ignore here, because we have dealed with it other place
        }

        return;
    }

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 什么是Node? (累计阅读 6,747)
  2. Netty和Jetty的Java NIO 网络框架模型分析 (累计阅读 5,610)
  3. Apache + Jetty 架设 CAS 单点登录 (累计阅读 5,182)
  4. Jetty线程“互锁”导致数据传输性能降低问题分析 (累计阅读 4,477)
  5. Chaos网络事件库开篇介绍(一) (累计阅读 4,037)
  6. php的异步http请求类 (累计阅读 3,831)
  7. 关于php的libevent扩展的应用 (累计阅读 3,809)
  8. Java Worker 设计模式 (累计阅读 3,757)
  9. 本周扑火之 http client 慢连接问题 (累计阅读 3,718)
  10. JavaScript程序执行顺序问题总结 (累计阅读 3,287)