隨筆 - 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 彭明華 閱讀(2799) 評論(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
          @彭明華
          看明白了,呵呵,我也忘記早給你回復。以前都是通過查詢鎖表實現的。這也是一種好方法,多交流。  回復  更多評論
            

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


          網站導航:
           
          主站蜘蛛池模板: 新干县| 南部县| 大关县| 许昌县| 丰台区| 嘉禾县| 灵台县| 冀州市| 巴彦淖尔市| 玉林市| 临朐县| 敦化市| 拜泉县| 平利县| 宣恩县| 灵石县| 芦山县| 黎城县| 武山县| 临海市| 阿合奇县| 兰溪市| 桂林市| 隆尧县| 吉安市| 通海县| 大理市| 都安| 五寨县| 泰兴市| 都昌县| 海南省| 沅陵县| 新丰县| 连平县| 福建省| 长宁区| 锦州市| 旬阳县| 平江县| 乐清市|