当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

创建的图为:

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

相关文章:

  • 成都Uber优步司机奖励政策(4月11日)
  • Tomcat6.0数据源配置
  • 同步和Java内存模型(四)有序性
  • git命令的简单使用
  • lintcode:买卖股票的最佳时机 I
  • PHP处理一个5G文件,使用内存512M的,数据为整形,从大到小排序,优化排序算法...
  • c++的this指针
  • CM android的CMUpdater分析(二)
  • Saving HDU hdu
  • activiti 动态配置 activiti 监听引擎启动和初始化(高级源码篇)
  • Webview组件和HTML的介绍
  • [一句秒懂]高仿QQ底部小红点弹簧效果
  • 安全关闭多Activity的Application
  • Android自定义控件之日历控件
  • path去除多余“/”和添加“/”正则
  • const let
  • Linux中的硬链接与软链接
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Sequelize 中文文档 v4 - Getting started - 入门
  • tweak 支持第三方库
  • vue总结
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 前端路由实现-history
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 首页查询功能的一次实现过程
  • 原生Ajax
  • PostgreSQL之连接数修改
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • $forceUpdate()函数
  • (1)(1.9) MSP (version 4.2)
  • (Python) SOAP Web Service (HTTP POST)
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net wcf memory gates checking failed
  • .net中的Queue和Stack
  • :中兴通讯为何成功
  • ??javascript里的变量问题
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [Android 数据通信] android cmwap接入点
  • [Android]Tool-Systrace
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [C#]winform部署yolov5-onnx模型
  • [C/C++]数据结构 循环队列
  • [C++]:for循环for(int num : nums)
  • [DP 训练] Longest Run on a Snowboard, UVa 10285
  • [iphone-cocos2d]关于Loading的若干处理和讨论
  • [javascript]Tab menu实现
  • [JS]JavaScript 简介
  • [LeetCode] Sort List
  • [LeetCode]剑指 Offer 40. 最小的k个数
  • [Linux] Boot分区满了的处理方法 The volume boot has only 0 bytes disk space remaining
  • [Linux内存管理-分页机制]—把一个虚拟地址转换为物理地址
  • [nlp] grad norm先降后升再降
  • [NOIP2005]过河