<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 11  文章 - 79  trackbacks - 0
    <2010年4月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    歡迎合作

     

    聯系方式:openhandx@foxmail.com

     

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

     

     

     

     

     

      OpenHandX-Batch

    快速部署手冊

     

     

     

     

     

    2010-3-23

     

    作者:彭明華

    openhandx@foxmail.com

     

    本文檔中的任何部分都不得以任何手段任何形式進行復制與傳播

    目錄

    1            前言

    2            基本原理

    3            總控服務器

    4            任務服務器

    5            如何向異步批量發起事件


     

    1          前言

    OpenHandX-Batch異步批量框架的功能在《OpenHandX-Batch企業級批量應用架構.doc》已經說得很清楚,OpenHandX-Batch異步批量架構由7大組件構成,用戶可以根據自己的情況選配不同的組件實現熱插拔,因此組件的組合非常多。本文就如何快速部署一個標準的企業級批量架構來說明。

    2          基本原理

    再次重復一下基本原理。



    舉例說明異步批量的最基本原理,實際應用要比這復雜得多。比如:某企業要生成年終表報,并且年終報表要按照企業的各個部門、分公司出,報表的數據來源有企業的財務系統、ERP系統、CRM系統。

    技術分析:

    1、              生成報表首先要把數據從各個系統數據庫中進行數據抽取、加工、匯總,最終生成報表,每步操作都要按照各個部門、分公司分類

    2、              總公司報表要等到各個部門和分公司加工、匯總的數據出來后再匯總,最后生成總公司報表

    3、              各個部門和分公司的數據抽取、加工、匯總可以是并行處理的,各個部門和分公司的報表生成可以和總公司的數據匯總并行處理。

    批量執行步驟:

    由上圖可以看出OpenHandX-Batch異步批量框架需要部署總控服務器和任務服務器,為了便于說明,這里所有服務器之間的通訊采用數據庫。

    3          總控服務器

    總控服務器包括本身的配置和節點運行圖配置。本身的配置涉及到事件的接收、任務的發送、任務信息的接收、日志的記錄。節點圖配置是指事件將要做的明細及運行的流程。

    首先給異步批量總控服務器和任務服務器創建一個數據庫,按照asynBatch.pdm創建表

    其次配置節點圖,這里創建的樹型節點圖,主要配置分為4塊,以某公司年報表為例:

    1、節點圖表BT_NODEMAP

    NODEMAPID

    NAME

    PARAMS

    TYPE

    說明

    節點運行圖編號

    節點運行圖名稱

    預先定義每個節點的任務參數,格式:

    參數1=xxx,參數2=xxx

    節點運行圖類型

    0-樹型運行圖

    1-層型運行圖

    舉例

    00001

    年報表

    0

    2、節點表BT_NODES

    NODEID

    PARAMS

    WEIGHT

    RERUN

    NAME

    ALIAS

    說明

    節點編號

    預先定義當前節點的任務參數,格式:

    參數1=xxx,參數2=xxx

    根據節點任務繁重情況設置,越繁重設置值越大,讓任務服務器留出更多的資源給此節點,默認為1

    重跑模式

    0-出錯流程退出

    1-出錯忽略

    2-出錯重試

    對應任務運行服務器配置文件中的節點名稱

    描述節點的中文名稱

    舉例

    00001

    1

    0

    DPT1

    部門數據抽取

    00002

    1

    0

    DPT2

    部門數據匯總

    00003

    1

    0

    DPTRPT

    部門報表生成

    00004

    1

    0

    HQ

    總公司數據匯總

    00005

    1

    0

    HQRPT

    總公司報表生成

    3、樹型節點關系表BT_TREENODEMAPRELA

    RELAID

    NODEMAPID

    PARENTIDS

    TYPE

    SOURCEID

    說明

    關系編號

    對應節點圖編號,表示關系編號屬于哪個節點圖

    依賴的父關系,格式:

    RELAID1RELAID2

    關系類型

    0-為基本的節點

    1-該節點為另一個自節點圖

    TYPE相關,對應節點編號或節點圖編號

    舉例

    00001

    00001

    0

    00001

    00002

    00001

    00001

    0

    00002

    00003

    00001

    00002

    0

    00003

    00004

    00001

    00002

    0

    00004

    00005

    00001

    00004

    0

    00005

    00002的上級是00001表示00002運行必須等到00001運行完成,0000300004運行必須要等到00002運行完成。

    4、事件結束最后執行的節點BT_FINYNODERELA

    NODEMAPID

    ORDERCODE

    NODEID

    說明

    對應節點圖編號,表示關系編號屬于哪個節點圖

    則執行的順序,一般從1開始

    對應節點編號

    舉例

    00001

    1

    CLS

    00006節點是FINALLY節點,不管事件的流程執行中是否出現錯誤都在最后執行,類似Java代碼中的

    try。。。finally

    最后配置總控服務器的配置文件

    <?xml version="1.0" encoding="UTF-8"?>

    <!--

        批量框架的異步總控配置文件,配置代表調度所依賴的數據信息。調度采用單一JVM運行模式。

        配置內容包括調度數據服務信息。消息交互配置等

       

        開發者: 彭明華

        創建時間:2008-04-30

    -->

    <configs>

        <controller id="001" acquireRetryDelay="1" waitRetryDelay="20" maxEventCount="5" correspond="false"/>

        <application id="app01" priority="0" persistent="true" loadPersistent="true" description="同一個jvm任務">

    配置節點拆分成任務的實現類

    配置解析器配置所在的位置,如:在testDB的若干表中

    采用樹型節點運行圖解析器,id="*"表示對所有事件節點圖都采用此方案

            <nodeMap id="*" className="open.batch.controller.impl.application.TreeNodeMap" params="source=testDb,nodemaptable=BT_NODEMAP,relatable=BT_TREENODEMAPRELA,nodetable=BT_NODES,finallynodetable=bt_finynoderela">

                <chunk className="open.batch.controller.impl.application.MultiInstanceTreeNodeChunk"/>

    配置接收事件的實現類及對應的數據庫和表

                <log className="open.batch.controller.impl.application.DBLog" params="source=testDb,eventtable=BT_EVENTSRUNLOG,nodetable=BT_NODESRUNLOG,tasktable=bt_tasksrunlog,tasklog=false,nodelog=true,eventlog=true"/>

    配置任務發送的實現類及對應的數據庫和表

            </nodeMap>

            <eventReceiver className="open.batch.controller.impl.message.DBEventReceiver" source=" testDb" params="table=BT_EVENTS"/>

            <taskSender className="open.batch.controller.impl.message.DBTaskSender" source="testDb" params="table=bt_tasks"/>

    配置任務信息接收的實現類及對應的數據庫和表

            <taskReceiver className="open.batch.controller.impl.message.DBTaskReceiver" source="testDb" params="table=bt_taskinfos"/>

            <resource>

    配置異步批量用的數據源(數據庫)

                <database id="testDb" url="jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=GBK" driver="com.mysql.jdbc.Driver" username="root" password="111111" maxConnection="20"/>

            </resource>

        </application>

    </configs>

    配置任務發送的實現類及對應的JMS和隊列名

    另外:這里舉例的配置使用的都是數據庫表,也可以使用JMS的實現類

    如:

           <taskSender className="open.batch.controller.impl.message.MessageTaskSender" source="pvmsjms" params="queue=task"/>

    配置任務信息接收的實現類及對應的JMS和隊列名

            <taskReceiver className="open.batch.controller.impl.message.MessageTaskReceiver" source="pvmsjms" params="queue=taskinfo"/>

            <resource>

    配置異步批量用的數據源(JMS

                <jms id="pvmsjms" url="tcp://localhost:61616" driver="org.activemq.ActiveMQConnectionFactory"/>

            </resource>

    4          任務服務器

    任務服務器是具體執行任務的地方,因此它的配置有兩個:任務服務器配置、任務的節點配置

    任務服務器配置

        <application id="app01" priority="0">

    配置任務信息發送的實現類及對應的數據庫和表

    任務的節點配置文件,可以同時定義多個

            <taskDefineConfig file="taskdefine.xml"/>

            <log className="open.batch.taskserver.impl.run.DBLog" source="testdb" params="table=BT_TASKSRUNLOG"/>

            <taskSenderclassName="open.batch.taskserver.impl.message.DBTaskSender" source="testdb" params="table=bt_taskinfos"/>

    配置任務接收的實現類及對應的數據庫和表

            <taskReceiverclassName="open.batch.taskserver.impl.message.DBTaskReceiver" source="testdb " params="table=bt_tasks"/>

            <resource>

                <databaseid="testdb" url="jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=GBK"

                    driver="com.mysql.jdbc.Driver" username="root" password="111111" maxConnection="10"/>

                <databaseid="erpdb" url="jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=GBK"

    以下是報表用的數據源,有ERPCRM和報表相關的

                    driver="com.mysql.jdbc.Driver" username="root" password="111111" maxConnection="10"/>

            </resource>

                <databaseid="crmdb" url="jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=GBK"

                    driver="com.mysql.jdbc.Driver" username="root" password="111111" maxConnection="10"/>

            </resource>

                <databaseid="reportdb" url="jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=GBK"

                    driver="com.mysql.jdbc.Driver" username="root" password="111111" maxConnection="10"/>

            </resource>

    </application>

    任務的節點配置(taskdefine.xml

    部門數據抽取節點配置

    <?xml version="1.0" encoding="UTF-8"?>

    <taskDefines>

        <taskDefine name="DPT1" params="">

            <taskRun singleInstance="true" className="open.dpt.Dpt"/>

    部門數據匯總節點配置

        </taskDefine>

       

        <taskDefine name="DPT2" params="">

    生成部門報表節點配置

            <taskRun singleInstance="true" className=" open.dpt.DptGatHer"/>

        </taskDefine>

        <taskDefine name="DPTRPT" params="">

            <taskRun singleInstance="true" className="open.dpt.DptReport"/>

        </taskDefine>

    總公司數據匯總節點配置

       

        <taskDefine name="HQ" params="">

            <taskRun singleInstance="true" className="open.hq.HQGatHer"/>

    總公司報表生成節點配置

        </taskDefine>

        <taskDefine name="HQRPT" params="">

            <taskRun singleInstance="true" className="open.hq.HQreport "/>

        </taskDefine>

        <taskDefine name="nullTask"/>

    </taskDefines>

    注意:總控服務器的BT_NODESname與以上配置的節點名字要一致

    5          如何向異步批量發起事件

    只要應用程序向BT_EVENTS的表里寫入一條數據即發起一個新的事件

    事件表BT_EVENTS

    ID

    EVENTID

    PARAMS

    CREATETIME

    RECTIME

    NODEMAPID

    說明

    事件表的自動編號

    應用發起的事件編號或標示,應用通過此號找到已發的事件

    定義整個事件的任務參數,格式:

    參數1=xxx,參數2=xxx

    創建時間

    接收時間

    節點圖編號,與要BT_NODEMAP定義的運行圖節點編號一致,不同的編號決定使用不同的節點運行圖

    舉例

    [不填]

    RPT0001

    dtpnum=001;002;003

    [當前系統時間]

    [不填]

    00001

    WEIGHT

    DESCRIPTION

    權重,越大表示該事件的工作越多,讓總控服務器留出更多的資源給此事件,默認為1

    描述

    5

    年報表

    posted on 2010-04-08 16:12 彭明華 閱讀(2795) 評論(13)  編輯  收藏 所屬分類: OpenHandX工具

    FeedBack:
    # re: OpenHandX-Batch1.0 快速部署手冊 2010-04-16 10:26 小山羊
    今天把AsynBatchConsole部署了,數據為oracle,數據也導入了,配置為
    <database id="pvmsdb1" url="jdbc:oracle:thin:@localhost:1521:orcl" driver="oracle.jdbc.driver.OracleDriver" username="root" password="111111" maxConnection="20"/>
    <database id="pvmsdb2" url="jdbc:oracle:thin:@localhost:1521:orcl" driver="oracle.jdbc.driver.OracleDriver" username="root" password="111111" maxConnection="20"/>

    我選擇的是“節點圖編輯平臺”,登陸成功后,出現以下問題,我跟蹤了發現是從緩沖池讀取連接時,conn為空,錯誤如下:
    10:21:52,406 INFO [STDOUT] 2010-04-16 10:21:52,406 [http-127.0.0.1-8000-2] ERROR open.batch.console.mapedit.MapEditServlet - MapEditServlet
    java.lang.ClassCastException: $Proxy57
    at open.database._Connection.getConnection(_Connection.java:38)
    at open.database.DatabaseDataSource.getFreeConnection(DatabaseDataSource.java:125)
    at open.database.DatabaseDataSource.getConnection(DatabaseDataSource.java:90)
    at open.database.DatabaseDataSource.getConnection(DatabaseDataSource.java:76)
    at open.batch.console.mapedit.NodeMapDAO.query(NodeMapDAO.java:918)
    at open.batch.console.mapedit.NodeMapDAO.queryNodeMap(NodeMapDAO.java:54)
    at open.batch.console.mapedit.NodeMapManager.queryNodeMap(NodeMapManager.java:41)
    at open.batch.console.mapedit.MapEditServlet.doPost(MapEditServlet.java:187)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at open.batch.console.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
    at java.lang.Thread.run(Unknown Source)
    10:21:52,406 INFO [STDOUT] 2010-04-16 10:21:52,406 [http-127.0.0.1-8000-2] DEBUG open.batch.console.mapedit.MapEditServlet - {"info":"$Proxy57\n","success":false}

      回復  更多評論
      
    # re: OpenHandX-Batch1.0 快速部署手冊 2010-04-16 10:29 小山羊
    以下是我跟蹤的問題,到_Connection中就出現錯誤,
    /**
    * Returns the conn.
    * @return Connection
    */
    public Connection getConnection() {
    //返回數據庫連接conn的接管類,以便截住close方法
    Connection conn2 = (Connection)Proxy.newProxyInstance(
    conn.getClass().getClassLoader(),
    conn.getClass().getInterfaces(),this);
    return conn2;
    }

    不知道是什么原因?  回復  更多評論
      
    # re: OpenHandX-Batch1.0 快速部署手冊 2010-04-16 11:37 小山羊
    調試到
    private Connection getFreeConnection(long nTimeout)
    throws SQLException
    {
    Connection conn = null;
    synchronized(conns){
    for(int i=conns.size()-1;i>=0;i--){
    _Connection _conn = conns.get(i);
    if(!_conn.isInUse() && _conn.getConnection().isClosed()){
    conns.remove(i);
    }else if(!_conn.isInUse()){
    conn = _conn.getConnection();
    _conn.setInUse(true);
    break;
    }
    }
    中的if(!_conn.isInUse() && _conn.getConnection().isClosed())判斷時開始出現問題
      回復  更多評論
      
    # re: OpenHandX-Batch1.0 快速部署手冊 2010-04-20 19:58 彭明華
    @小山羊
    從錯誤的問題詳細信息看,是以下代碼出的問題
    Connection conn2 = (Connection)Proxy.newProxyInstance(
    conn.getClass().getClassLoader(),
    conn.getClass().getInterfaces(),this);
    可能是oracle驅動版本的問題,換個版本試試  回復  更多評論
      
    # re: OpenHandX-Batch1.0 快速部署手冊 2010-04-28 08:47 小山羊
    能不能提供一個jms得配置文件?  回復  更多評論
      
    # re: OpenHandX-Batch1.0 快速部署手冊 2010-04-29 11:06 小山羊
    在日志中發現的錯誤:TreeNodeMap read nodeMap error
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'null where NODEMAPID='00002'' at line 1
      回復  更多評論
      
    # re: OpenHandX-Batch1.0 快速部署手冊 2010-05-06 09:07 彭明華
    @小山羊
    是這句話引起的錯誤
    select * from " + configParams.get("nodemaptable") + " where NODEMAPID=?
    由于配置文件的<nodeMap的params屬性中沒有配置 nodemaptable  回復  更多評論
      
    # re: OpenHandX-Batch1.0 快速部署手冊 2010-05-06 09:13 彭明華
    @小山羊
    <jms id="pvmsjms" url="tcp://192.168.1.247:61616" driver="org.activemq.ActiveMQConnectionFactory"/>  回復  更多評論
      
    # re: OpenHandX-Batch1.0 快速部署手冊 2012-09-17 16:56 wmj2003
    upst = cnn.prepareStatement("update " + configParams.get("table") + " set TASKID=TASKID where ID=" + id);  回復  更多評論
      
    # re: OpenHandX-Batch1.0 快速部署手冊 2012-09-17 16:58 wmj2003
    open.batch.taskserver.impl.message.DBTaskReceiver 中getTask()方法的實現有問題,在集群環境中,多臺服務器獲取任務的是否在插敘的時候鎖表呢?  回復  更多評論
      
    # re: OpenHandX-Batch1.0 快速部署手冊 2012-09-17 17:00 wmj2003
    open.batch.taskserver.impl.message.DBTaskReceiver 中getTask()方法的實現有問題,在集群環境中,多臺服務器獲取任務的時候,是否需要鎖表呢?  回復  更多評論
      
    # re: OpenHandX-Batch1.0 快速部署手冊 2012-10-31 09:19 彭明華
    @wmj2003
    最近再忙另外一個項目,很少上blog,抱歉.
    upst = cnn.prepareStatement("update " + configParams.get("table") + " set TASKID=TASKID where ID=" + id);
    就是一個鎖表記錄操作,鎖完后再查詢狀態RECTIME,就能保證多臺服務器獲并發時任務不會重復被執行  回復  更多評論
      
    # re: OpenHandX-Batch1.0 快速部署手冊 2012-11-22 10:29 wmj2003
    @彭明華
    看明白了,呵呵,我也忘記早給你回復。以前都是通過查詢鎖表實現的。這也是一種好方法,多交流。  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 免费无码精品黄AV电影| 亚洲第一页中文字幕| 成人啪精品视频免费网站| 99久久成人国产精品免费| 亚洲av日韩av永久无码电影| 亚洲最大的成网4438| 亚洲自偷自偷图片| 亚洲伊人久久成综合人影院| 免费黄色大片网站| 免费看黄视频网站| 毛片免费全部播放无码 | 精品久久免费视频| 100部毛片免费全部播放完整| 丝袜捆绑调教视频免费区| 老司机午夜在线视频免费| 亚洲最大的成人网| 亚洲一卡2卡4卡5卡6卡残暴在线| 日韩精品亚洲人成在线观看| 亚洲国产婷婷六月丁香| 亚洲欧洲日产国码av系列天堂 | 亚洲AV无码一区二区一二区| 亚洲精品天堂在线观看| 亚洲精品欧洲精品| 久久久久久亚洲Av无码精品专口| 亚洲av综合avav中文| 亚洲成AV人片在线观看| 黑人大战亚洲人精品一区 | 国产一级a毛一级a看免费视频| 美女视频黄.免费网址| 国产成人亚洲精品蜜芽影院| 狠狠入ady亚洲精品| 爱情岛论坛亚洲品质自拍视频网站 | 在线观看亚洲AV日韩A∨| 亚洲综合偷自成人网第页色| 亚洲一区在线免费观看| 亚洲香蕉久久一区二区三区四区| 亚洲精品免费网站| 久久亚洲精品11p| 免费人成大片在线观看播放| 中美日韩在线网免费毛片视频| 三级网站在线免费观看|