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

馋奶兔 提交于 2019-12-06 03:42:22

创建的图为:

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

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"}"

搞定!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!