博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Play源码深入之二:Play应用启动时框架的初始化
阅读量:6533 次
发布时间:2019-06-24

本文共 3529 字,大约阅读时间需要 11 分钟。

  hot3.png

接着 在python的辅助下,理理输入启动命令之后,play框架进行的初始化工作。 application.py中的java_cmd方法中就有play.server.Server。

def java_cmd(self, java_args, cp_args=None, className='play.server.Server', args = None):

在这个类中可以看到亲切的main方法,就是框架的入口了。

public class Server {    ...    public static void main(String[] args) throws Exception {        File root = new File(System.getProperty("application.path"));        if (System.getProperty("precompiled", "false").equals("true")) {            Play.usePrecompiled = true;        }        if (System.getProperty("writepid", "false").equals("true")) {            writePID(root);        }        Play.init(root, System.getProperty("play.id", ""));        if (System.getProperty("precompile") == null) {            new Server(args);        } else {            Logger.info("Done.");        }    }    ...}

其中对play.Play:init()方法对框架进行了初始化,包括应用的状态、应用java代码、模板、路由的位置、cookie域名称等。

public class Play {    ...    public static void init(File root, String id) {        ...        // Main route file        routes = appRoot.child("conf/routes");        // Plugin route files        modulesRoutes = new HashMap
(16);        // Load modules        loadModules(appRoot);        // Load the templates from the framework after the one from the modules        templatesPath.add(VirtualFile.open(new File(frameworkPath, "framework/templates")));        // Enable a first classloader        classloader = new ApplicationClassloader();        // Fix ctxPath        if ("/".equals(Play.ctxPath)) {            Play.ctxPath = "";        }        // Default cookie domain        Http.Cookie.defaultDomain = configuration.getProperty("application.defaultCookieDomain", null);        if (Http.Cookie.defaultDomain!=null) {            Logger.info("Using default cookie domain: " + Http.Cookie.defaultDomain);        }        // Plugins        pluginCollection.loadPlugins();        ...    }    ...}

其中最关键的是对play插件的读入。play.plugins.PluginCollection:loadPlugins()方法,play的应用每个事件,如应用启动、访问到达、访问结束、代码变动、应用停止等等,都会逐一交给各个插件处理。 在play源码中已经定义一些plugins,并有顺序。

0:play.CorePlugin100:play.data.parsing.TempFilePlugin200:play.data.validation.ValidationPlugin300:play.db.DBPlugin400:play.db.jpa.JPAPlugin450:play.db.Evolutions500:play.i18n.MessagesPlugin600:play.libs.WS700:play.jobs.JobsPlugin100000:play.plugins.ConfigurablePluginDisablingPlugin

我们也可以定义自己的Plugins继承PlayPlugins,然后在应用app目录下如框架中一样,建立play.plugins文件,就也能接受play事件的推送了。

 

在Server的构造方法中,准备一些netty启动需要的参数之后,就开启了netty,其中重要的是 设定了HttpServerPipelineFactory

public class Server {    ...    public Server(String[] args) {       ...        ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(                Executors.newCachedThreadPool(), Executors.newCachedThreadPool())        );        try {            if (httpPort != -1) {                bootstrap.setPipelineFactory(new HttpServerPipelineFactory());                bootstrap.bind(new InetSocketAddress(address, httpPort));                bootstrap.setOption("child.tcpNoDelay", true);       ...    }    ...}

当第一次访问到时,netty将请求转到play.server.HttpServerPipelineFactory中。其中配置了play.server.PlayHandler处理类。netty会用PlayHandler来处理请求。

private String pipelineConfig = Play.configuration.getProperty("play.netty.pipeline", "play.server.FlashPolicyHandler,org.jboss.netty.handler.codec.http.HttpRequestDecoder,play.server.StreamChunkAggregator,org.jboss.netty.handler.codec.http.HttpResponseEncoder,org.jboss.netty.handler.stream.ChunkedWriteHandler,play.server.PlayHandler");

在往后,就进入了下一篇文章。

转载于:https://my.oschina.net/markho/blog/498292

你可能感兴趣的文章
五大常用算法简述
查看>>
Windows下leapmotion中touchless的使用
查看>>
贺建奎:愿意用自己孩子第一个尝试,研究不小心泄露,英美也有类似实验
查看>>
认真的做羞羞的事 一颗种子的自我分享
查看>>
数据库迁移
查看>>
你应该了解的大数据10个新趋势
查看>>
Java 实现阿里云短信
查看>>
CPU 已不足以驱动屏幕指纹识别技术,于是 vivo 用 DSP 来加速
查看>>
设计模式 (23种)
查看>>
Intellij IDEA 2017.3 基于编辑器的REST客户端介绍
查看>>
nodejs爬虫
查看>>
进程间通信基础知识
查看>>
C#6.0 十大常用特性
查看>>
MP实战系列(一)之入门框架搭建和使用
查看>>
JavaScript高级程序设计学习(四)之引用类型
查看>>
CSS > 译文:理解CSS中的块级格式化上下文
查看>>
DevOps:持續整合 & 持續交付(Docker、CircleCI、AWS)
查看>>
sbt的assembly插件
查看>>
linux安全基本防护
查看>>
Android:随笔——强大的ConstraintLayout
查看>>