Azkaban的Web Server源码探究系列14:创建Project

本文分析了Azkaban中ProjectManagerServlet的工作原理,重点介绍了init方法中各组件的初始化过程以及doPost方法中对创建项目的处理流程。此外,还深入探讨了handleCreate方法内部实现,特别是如何通过数据库操作来完成新项目的创建。

创建的图为:

015602_tinL_1382024.png

通过抓包,可以分析出 路径为: 

POST /manager HTTP/1.1

所以,需要分析

root.addServlet(new ServletHolder(new ProjectManagerServlet()), "/manager");

分析ProjectManagerServlet

=================================================================================

1)init

 @Override

  public void init(ServletConfig config) throws ServletException {

    super.init(config);

 

    AzkabanWebServer server = (AzkabanWebServer) getApplication();

    projectManager = server.getProjectManager();

    executorManager = server.getExecutorManager();

    scheduleManager = server.getScheduleManager();

    userManager = server.getUserManager();

    lockdownCreateProjects =

        server.getServerProps().getBoolean(LOCKDOWN_CREATE_PROJECTS_KEY, false);

    if (lockdownCreateProjects) {

      logger.info("Creation of projects is locked down");

    }

 

    downloadBufferSize =

        server.getServerProps().getInt(PROJECT_DOWNLOAD_BUFFER_SIZE_IN_BYTES,

            8192);

 

    logger.info("downloadBufferSize: " + downloadBufferSize);

  }

比较简单,就不多说了。

2)doPost

  @Override

  protected void handlePost(HttpServletRequest req, HttpServletResponse resp,

      Session session) throws ServletException, IOException {

  //从这里开始

    if (hasParam(req, "action")) {

      String action = getParam(req, "action");

      if (action.equals("create")) {//如果是创建Project

        handleCreate(req, resp, session);

      }

    }

  }

下面就需要去看handleCreate的代码。。。

========================================================================

 private synchronized Project createNewProject(Connection connection,

      String name, String description, User creator)

      throws ProjectManagerException {

    QueryRunner runner = new QueryRunner();

    ProjectResultHandler handler = new ProjectResultHandler();

 

    //查看是否存在

    try {

      List<Project> project =

          runner

              .query(connection,

                  ProjectResultHandler.SELECT_ACTIVE_PROJECT_BY_NAME, handler,

                  name);

      if (!project.isEmpty()) {

        throw new ProjectManagerException("Active project with name " + name

            + " already exists in db.");

      }

    } catch (SQLException e) {

      logger.error(e);

      throw new ProjectManagerException(

          "Checking for existing project failed. " + name, e);

    }

    //执行插入语句

    final String INSERT_PROJECT =

        "INSERT INTO projects ( name, active, modified_time, create_time, version, last_modified_by, description, enc_type, settings_blob) values (?,?,?,?,?,?,?,?,?)";

    // Insert project

    try {

      long time = System.currentTimeMillis();

      int i =

          runner.update(connection, INSERT_PROJECT, name, true, time, time,

              null, creator.getUserId(), description,

              defaultEncodingType.getNumVal(), null);

      if (i == 0) {

        throw new ProjectManagerException("No projects have been inserted.");

      }

      connection.commit();

 

    } catch (SQLException e) {

      logger.error(INSERT_PROJECT + " failed.");

      try {

        connection.rollback();

      } catch (SQLException e1) {

        e1.printStackTrace();

      }

      throw new ProjectManagerException(

          "Insert project for existing project failed. " + name, e);

    }

    //顺利插入

    // Do another query to grab and return the project.

    Project project = null;

    try {

      List<Project> projects =

          runner

              .query(connection,

                  ProjectResultHandler.SELECT_ACTIVE_PROJECT_BY_NAME, handler,

                  name);

      if (projects.isEmpty()) {

        throw new ProjectManagerException("No active project with name " + name

            + " exists in db.");

      } else if (projects.size() > 1) {

        throw new ProjectManagerException("More than one active project "

            + name);

      }

 

      project = projects.get(0);

    } catch (SQLException e) {

      logger.error(e);

      throw new ProjectManagerException(

          "Checking for existing project failed. " + name, e);

    }

    //返回

    return project;

  }


当然,最后做了一个event 跟踪,

然后再返回给浏览器以下内容:

1032224350@qtp-808228639-2[1] print response

 response = "{"path":"manager?project=adf","action":"redirect","status":"success"}"

搞定!

转载于:https://my.oschina.net/qiangzigege/blog/655499

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值