文档章节

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

强子1985
 强子1985
发布于 2016/04/09 01:56
字数 420
阅读 387
收藏 0

创建的图为:

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

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

搞定!

© 著作权归作者所有

强子1985

强子1985

粉丝 895
博文 1296
码字总数 959176
作品 8
南京
架构师
私信 提问
Azkaban的Web Server源码探究系列17:Creating Flows

到目前为止,一切还比较顺利!工程Project已经创建完毕,下面来尝试创建一个flow. === 什么是 flow? A job is a process you want to run in Azkaban. Jobs can be set up to be dependent ...

强子哥哥
2016/04/09
214
0
Azkaban的Web Server源码探究系列16:跳转Project

上节说完了创建,这下来说跳转到Project. ====================================================================== 所以,还是得用/manager对应的servlet来执行,下面稍微跟踪一下: ====...

强子哥哥
2016/04/09
119
0
Azkaban的Web Server源码探究系列21: Flow执行前的准备工作

之前说到的上传flow,到最后都转化为数据库里的若干记录,当然是多个表的数据一起来全方位阐述这个你上传的flow. 那么,flow到底如何执行呢? 今天就开始研究flow的执行过程! ==============...

强子哥哥
2016/04/10
164
0
【Azkaban搭建】---Azkaban 3.25.0搭建细则 超实用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LHWorldBlog/article/details/84305321 drop table active_sla;drop table execution_flows;drop table execu......

LHWorldBlog
2018/11/02
0
0
hadoop工作流引擎azkaban

介绍 Azkaban是twitter出的一个任务调度系统,操作比Oozie要简单很多而且非常直观,提供的功能比较简单。Azkaban以Flow为执行单元进行定时调度,Flow就是预定义好的由一个或多个可存在依赖关...

wayhk
2016/05/13
104
0

没有更多内容

加载失败,请刷新页面

加载更多

rsync工具常用选项以及同步的两种方式

rsync -av /etc/passwd /tmp/1.txt #rsync的本机传输写法 rsync -av /tmp/1.txt 192.168.188.128:/tmp/2.txt #rsync的远程传输rsync格式rsync [OPTION] … SRC ......

林怡丰
今天
3
0
GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238

GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238 (Address already in use) 官方文档虽然有相同的问题,但是对我的问题没起作用…… 后面发现自己手贱...

wenzhizhong
昨天
3
0
REST接口

文章来源 https://zhuanlan.zhihu.com/p/28674721?group_id=886181549958119424 http://www.ruanyifeng.com/blog/2014/05/restful_api.html REST 对请求的约定 REST 用来规范应用如何在 HTTP......

Airship
昨天
6
0
Spring Cloud Config 统一配置中心

Spring Cloud Config 统一配置中心 一、统一配置中心 统一管理配置 通常,我们会使用配置文件来管理应用的配置。如一个 Spring Boot 的应用,可以将配置信息放在 application.yml 文件中,如...

非摩尔根
昨天
6
0
android ------ AAPT2 error: check logs for details解决方法

AAPT 是全称是 Android Asset Packaging Tool,它是构建 App,甚至是构建 Android 系统都必不可少的一个工具。它的作用是将所有资源文件压缩打包到Android APK 当中。我们在 Android SDK 目录...

切切歆语
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部