zoukankan      html  css  js  c++  java
  • [OFBiz]开发 三

    1. Debug
    不要在Eclipse中使用Ant来启动ofbiz, 因为在Eclipse中无法kill掉Ant的进程,而ofbiz又没有提供stop的方法。(有一个hook shutdown的方法,但是没有作用)

    使用startofbiz.bat来启动ofbiz, 打开debug模式,端口5005.
    注意:如果需要对org.ofbiz.base.start.Start进行debug的话,需要修改:
    -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005

    2.ofbiz-component.xml
    总共有60个ofbiz-componnet.xml文件。
    E:eclipse-SDK-3.7.1-win32ofbizapache-ofbiz-10.04frameworkcatalinaofbiz-component.xml
    配置的是Tomcat的模块

    E:eclipse-SDK-3.7.1-win32ofbizapache-ofbiz-10.04applicationscontentofbiz-component.xml
    配置的是content web应用程序的模块
    它含有webapp节点:
        

    <webapp name="content"
            title="Content"
            server="default-server"
            location="webapp/content"
            base-permission="CONTENTMGR"
            mount-point="/content"/>


    3.启动过程:org.ofbiz.base.start.Start
     

       private void startStartLoaders() {
            // start the loaders
            for (StartupLoader loader: loaders) {
                try {
                    loader.start();
                } catch (StartupException e) {
                    e.printStackTrace();
                    System.exit(99);
                }
            }
            serverStarted = true;
        }




    然后,进入org.ofbiz.base.container.ContainerLoader的start()方法中, 启动所有的Container:

      

     
        public void start() throws StartupException {
            Debug.logInfo("[Startup] Starting containers...", module);
    
            // start each container object
            for (Container container: loadedContainers) {
                try {
                    container.start();
                } catch (ContainerException e) {
                    throw new StartupException("Cannot start() " + container.getClass().getName(), e);
                } catch (java.lang.AbstractMethodError e) {
                    throw new StartupException("Cannot start() " + container.getClass().getName(), e);
                }
            }
        }





    tomcat, 就是其中的一个作为container启动的模块。

    4. 关于ofbiz-component.xml的DTD:
    http://ofbiz.apache.org/dtds/ofbiz-component.xsd

    <classpath type="jar" location="lib/*"/>   ------------------>classpath相关
    <classpath type="jar" location="build/lib/*"/>
    <classpath type="dir" location="config"/>
    <entity-resource type="model"
    reader-name="main" loader="main" location="entitydef/entitymodel.xml"/>



    classpath可以支持这两种形式:

    <classpath type="jar" location="lib/product.jar"/>
    <classpath type="dir" location="classes"/>



    5.配置文件读取过程:
    1), 先从System.getProperty("ofbiz.system.props")中,找到global的配置文件,加载到System properties中。
    2),通过String cfgFile = Start.getConfigFileName(firstArg);得到类似于:
    org/ofbiz/base/start/start.properties
    这样的配置文件。

    6.classpath的加载:
    org.ofbiz.base.start.Start.initClasspath()
    org.ofbiz.base.start.Start.loadLibs(String, boolean)
    它将把以下路径,添加到classpath中去:
    E:eclipse-SDK-3.7.1-win32ofbizapache-ofbiz-10.04ofbiz.jar;  ------------>启动类
    E:jdk1.6.0_20lib ools.jar;
    E:eclipse-SDK-3.7.1-win32ofbizapache-ofbiz-10.04  ------------>ofbiz HOME

    E:/eclipse-SDK-3.7.1-win32/ofbiz/apache-ofbiz-10.04/framework/base/lib
    E:/eclipse-SDK-3.7.1-win32/ofbiz/apache-ofbiz-10.04/framework/base/build/lib/ofbiz-base.jar
    E:/eclipse-SDK-3.7.1-win32/ofbiz/apache-ofbiz-10.04/framework/base/dtd
    E:/eclipse-SDK-3.7.1-win32/ofbiz/apache-ofbiz-10.04/framework/base/config

    而:
    containerconfig=E:/eclipse-SDK-3.7.1-win32/ofbiz/apache-ofbiz-10.04/framework/base/config/ofbiz-containers.xml

    7.Debug信息输出:启动JVM时,加上-DDEBUG=true属性.
    if (System.getProperty("DEBUG") != null)

    8.启动过程中:
          

      if (fullInit) {
                // initialize the classpath
                initClasspath();  ---------->重要
    
                // initialize the log directory
                initLogDirectory();
    
                // initialize the listener thread
                initListenerThread();
    
                // initialize the startup loaders
                initStartLoaders(); ---------->重要
    
                // set the shutdown hook
                if (config.useShutdownHook) {
                    setShutdownHook();
                } else {
                    System.out.println("Shutdown hook disabled");
                }
            }
        }
    
    
    start.init(args, true);
    start.start();


    =============>start.init(args, true);
    1. 将执行start.properties里面的ofbiz.start.loader1=org.ofbiz.base.container.ContainerLoader
    2. 它的org.ofbiz.base.container.ContainerLoader.load(Config, String[])方法,
    将会被执行。
    3. 把E:/eclipse-SDK-3.7.1-win32/ofbiz/apache-ofbiz-10.04/framework/base/config/ofbiz-containers.xml作为参数传进来
    4. 将会从ofbiz-containers.xml中读取9个containers,其中包括了tomcat的那个:
    [
    org.ofbiz.base.container.ContainerConfig$Container@185fe0c, org.ofbiz.base.container.ContainerConfig$Container@1e9f5cc, org.ofbiz.base.container.ContainerConfig$Container@1082823, org.ofbiz.base.container.ContainerConfig$Container@831a91, org.ofbiz.base.container.ContainerConfig$Container@1453d72, org.ofbiz.base.container.ContainerConfig$Container@c5186e, org.ofbiz.base.container.ContainerConfig$Container@1c70315, org.ofbiz.base.container.ContainerConfig$Container@9b59a2, org.ofbiz.base.container.ContainerConfig$Container@119db9e
    ]

    10个配置的containers:
    component-container
    classloader-container
    commons-vfs-container
    webslinger-container
    naming-container
    rmi-dispatcher
    catalina-container  --------->tomcat
    ajp-connector
    birt-container
    beanshell-container

    得到:

    <container name="catalina-container" class="org.ofbiz.catalina.container.CatalinaContainer">



    这里只是收集作用,把它们(9个containers)
    放到org.ofbiz.base.container.ContainerLoader.loadedContainers存起来。


    =============>start.start();
    1. 将执行start.properties里面的ofbiz.start.loader1=org.ofbiz.base.container.ContainerLoader
    2. 它的org.ofbiz.base.container.ContainerLoader.start()方法,
    将会被执行。
    3.它会把刚才记录的9个containers都进行初始起动的。


    9.考察Tomcat的启动过程:

    <container name="catalina-container" class="org.ofbiz.catalina.container.CatalinaContainer">


    先是初始化:
    org.ofbiz.catalina.container.CatalinaContainer.init(String[], String)
    ------>它是在start.init(args, true);的时候,被带起来执行的。
    org.ofbiz.catalina.container.CatalinaContainer.loadComponents() ---->循环
    org.ofbiz.catalina.container.CatalinaContainer.createContext(WebappInfo)

    然后,才是在start.start();的时候,被启动的:
    org.ofbiz.catalina.container.CatalinaContainer.start()

    信息:debug在:org.ofbiz.catalina.container.CatalinaContainer.loadComponents()

    // load the applications
    List<ComponentConfig.WebappInfo> webResourceInfos = ComponentConfig.getAllWebappResourceInfos();



    可以得到44个web应用程序。


    10.一个很重要的jar包:
    E:eclipse-SDK-3.7.1-win32ofbizapache-ofbiz-10.04frameworkaseuildlibofbiz-base.jar

    它里面的:org.ofbiz.base.component.ComponentConfig.getAllComponents()
    也是一个很重要的方法。

    关注一下:componentConfigs.put(componentConfig.getGlobalName(), componentConfig);
    是什么时候被调用,被填上值的。

    它是在start.init(args, true);的时候,它是配置在ofbiz-containers.xml中的第一个节点:

    <!-- load the ofbiz component container (always first) -->
    <container name="component-container" class="org.ofbiz.base.container.ComponentContainer"/>



    它是作为一个container被启动的,它的作用是负责收集所有的component模块信息。

    收集的结果,放在:
    org.ofbiz.base.component.ComponentConfig.componentConfigs
    protected static Map<String, ComponentConfig> componentConfigs
    以备接下来的其它的container(如:tomcat),初始化webapp时使用。

    每一个ofbiz-component.xml对应于下面的这个类:
    org.ofbiz.base.component.ComponentConfig.ComponentConfig(String, String)
    ofbiz-component.xml里面的节点,都是在这个类的构造方法中被解析的,包括webapp:
          

            // webapp - webappInfos
            for (Element curElement: UtilXml.childElementList(ofbizComponentElement, "webapp")) {
                WebappInfo webappInfo = new WebappInfo(this, curElement);
                this.webappInfos.add(webappInfo);
            }
    
            // classpath - classpathInfos
            for (Element curElement: UtilXml.childElementList(ofbizComponentElement, "classpath")) {
                ClasspathInfo classpathInfo = new ClasspathInfo(this, curElement);
                this.classpathInfos.add(classpathInfo);
            }
  • 相关阅读:
    2013.4.15 Particle Swarm Optimization with Skyline Operator for Fast Cloudbased Web Service Composition
    Adaptive service composition in flexible processes
    2013.4.13 DomainSpecific Service Selection for Composite Services
    2013.4.14 Modeling and Algorithms for QoSAware Service Composition in VirtualizationBased Cloud Computing
    2013.5.29 Towards Networkaware Service Composition in the Cloud
    Efficient algorithms for Web services selection with endtoend QoS constraints
    SQL Server中常用的SQL语句
    接口限流自定义注解
    linux服务器生产环境搭建
    MVEL自定义函数重复掉用报错:duplicate function
  • 原文地址:https://www.cnblogs.com/ofbiz/p/3145733.html
Copyright © 2011-2022 走看看