隨筆 - 11  文章 - 79  trackbacks - 0
          <2010年5月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          歡迎合作

           

          聯(lián)系方式:openhandx@foxmail.com

           

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           

           

           

           

           

            OpenHandX-Batch

          快速部署手冊

           

           

           

           

           

          2010-3-23

           

          作者:彭明華

          openhandx@foxmail.com

           

          本文檔中的任何部分都不得以任何手段任何形式進(jìn)行復(fù)制與傳播

          目錄

          1            前言

          2            基本原理

          3            總控服務(wù)器

          4            任務(wù)服務(wù)器

          5            如何向異步批量發(fā)起事件


           

          1          前言

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

          2          基本原理

          再次重復(fù)一下基本原理。



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

          技術(shù)分析:

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

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

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

          批量執(zhí)行步驟:

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

          3          總控服務(wù)器

          總控服務(wù)器包括本身的配置和節(jié)點運(yùn)行圖配置。本身的配置涉及到事件的接收、任務(wù)的發(fā)送、任務(wù)信息的接收、日志的記錄。節(jié)點圖配置是指事件將要做的明細(xì)及運(yùn)行的流程。

          首先給異步批量總控服務(wù)器和任務(wù)服務(wù)器創(chuàng)建一個數(shù)據(jù)庫,按照asynBatch.pdm創(chuàng)建表

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

          1、節(jié)點圖表BT_NODEMAP

          NODEMAPID

          NAME

          PARAMS

          TYPE

          說明

          節(jié)點運(yùn)行圖編號

          節(jié)點運(yùn)行圖名稱

          預(yù)先定義每個節(jié)點的任務(wù)參數(shù),格式:

          參數(shù)1=xxx,參數(shù)2=xxx

          節(jié)點運(yùn)行圖類型

          0-樹型運(yùn)行圖

          1-層型運(yùn)行圖

          舉例

          00001

          年報表

          0

          2、節(jié)點表BT_NODES

          NODEID

          PARAMS

          WEIGHT

          RERUN

          NAME

          ALIAS

          說明

          節(jié)點編號

          預(yù)先定義當(dāng)前節(jié)點的任務(wù)參數(shù),格式:

          參數(shù)1=xxx,參數(shù)2=xxx

          根據(jù)節(jié)點任務(wù)繁重情況設(shè)置,越繁重設(shè)置值越大,讓任務(wù)服務(wù)器留出更多的資源給此節(jié)點,默認(rèn)為1

          重跑模式

          0-出錯流程退出

          1-出錯忽略

          2-出錯重試

          對應(yīng)任務(wù)運(yùn)行服務(wù)器配置文件中的節(jié)點名稱

          描述節(jié)點的中文名稱

          舉例

          00001

          1

          0

          DPT1

          部門數(shù)據(jù)抽取

          00002

          1

          0

          DPT2

          部門數(shù)據(jù)匯總

          00003

          1

          0

          DPTRPT

          部門報表生成

          00004

          1

          0

          HQ

          總公司數(shù)據(jù)匯總

          00005

          1

          0

          HQRPT

          總公司報表生成

          3、樹型節(jié)點關(guān)系表BT_TREENODEMAPRELA

          RELAID

          NODEMAPID

          PARENTIDS

          TYPE

          SOURCEID

          說明

          關(guān)系編號

          對應(yīng)節(jié)點圖編號,表示關(guān)系編號屬于哪個節(jié)點圖

          依賴的父關(guān)系,格式:

          RELAID1RELAID2

          關(guān)系類型

          0-為基本的節(jié)點

          1-該節(jié)點為另一個自節(jié)點圖

          TYPE相關(guān),對應(yīng)節(jié)點編號或節(jié)點圖編號

          舉例

          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運(yùn)行必須等到00001運(yùn)行完成,0000300004運(yùn)行必須要等到00002運(yùn)行完成。

          4、事件結(jié)束最后執(zhí)行的節(jié)點BT_FINYNODERELA

          NODEMAPID

          ORDERCODE

          NODEID

          說明

          對應(yīng)節(jié)點圖編號,表示關(guān)系編號屬于哪個節(jié)點圖

          則執(zhí)行的順序,一般從1開始

          對應(yīng)節(jié)點編號

          舉例

          00001

          1

          CLS

          00006節(jié)點是FINALLY節(jié)點,不管事件的流程執(zhí)行中是否出現(xiàn)錯誤都在最后執(zhí)行,類似Java代碼中的

          try。。。finally

          最后配置總控服務(wù)器的配置文件

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

          <!--

              批量框架的異步總控配置文件,配置代表調(diào)度所依賴的數(shù)據(jù)信息。調(diào)度采用單一JVM運(yùn)行模式。

              配置內(nèi)容包括調(diào)度數(shù)據(jù)服務(wù)信息。消息交互配置等

             

              開發(fā)者: 彭明華

              創(chuàng)建時間: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任務(wù)">

          配置節(jié)點拆分成任務(wù)的實現(xiàn)類

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

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

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

          配置接收事件的實現(xiàn)類及對應(yīng)的數(shù)據(jù)庫和表

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

          配置任務(wù)發(fā)送的實現(xiàn)類及對應(yīng)的數(shù)據(jù)庫和表

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

          配置任務(wù)信息接收的實現(xiàn)類及對應(yīng)的數(shù)據(jù)庫和表

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

                  <resource>

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

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

          配置任務(wù)發(fā)送的實現(xiàn)類及對應(yīng)的JMS和隊列名

          另外:這里舉例的配置使用的都是數(shù)據(jù)庫表,也可以使用JMS的實現(xiàn)類

          如:

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

          配置任務(wù)信息接收的實現(xiàn)類及對應(yīng)的JMS和隊列名

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

                  <resource>

          配置異步批量用的數(shù)據(jù)源(JMS

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

                  </resource>

          4          任務(wù)服務(wù)器

          任務(wù)服務(wù)器是具體執(zhí)行任務(wù)的地方,因此它的配置有兩個:任務(wù)服務(wù)器配置、任務(wù)的節(jié)點配置

          任務(wù)服務(wù)器配置

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

          配置任務(wù)信息發(fā)送的實現(xiàn)類及對應(yīng)的數(shù)據(jù)庫和表

          任務(wù)的節(jié)點配置文件,可以同時定義多個

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

          配置任務(wù)接收的實現(xiàn)類及對應(yīng)的數(shù)據(jù)庫和表

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

          以下是報表用的數(shù)據(jù)源,有ERP、CRM和報表相關(guān)的

                          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>

          任務(wù)的節(jié)點配置(taskdefine.xml

          部門數(shù)據(jù)抽取節(jié)點配置

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

          <taskDefines>

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

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

          部門數(shù)據(jù)匯總節(jié)點配置

              </taskDefine>

             

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

          生成部門報表節(jié)點配置

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

              </taskDefine>

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

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

              </taskDefine>

          總公司數(shù)據(jù)匯總節(jié)點配置

             

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

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

          總公司報表生成節(jié)點配置

              </taskDefine>

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

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

              </taskDefine>

              <taskDefine name="nullTask"/>

          </taskDefines>

          注意:總控服務(wù)器的BT_NODESname與以上配置的節(jié)點名字要一致

          5          如何向異步批量發(fā)起事件

          只要應(yīng)用程序向BT_EVENTS的表里寫入一條數(shù)據(jù)即發(fā)起一個新的事件

          事件表BT_EVENTS

          ID

          EVENTID

          PARAMS

          CREATETIME

          RECTIME

          NODEMAPID

          說明

          事件表的自動編號

          應(yīng)用發(fā)起的事件編號或標(biāo)示,應(yīng)用通過此號找到已發(fā)的事件

          定義整個事件的任務(wù)參數(shù),格式:

          參數(shù)1=xxx,參數(shù)2=xxx

          創(chuàng)建時間

          接收時間

          節(jié)點圖編號,與要BT_NODEMAP定義的運(yùn)行圖節(jié)點編號一致,不同的編號決定使用不同的節(jié)點運(yùn)行圖

          舉例

          [不填]

          RPT0001

          dtpnum=001;002;003

          [當(dāng)前系統(tǒng)時間]

          [不填]

          00001

          WEIGHT

          DESCRIPTION

          權(quán)重,越大表示該事件的工作越多,讓總控服務(wù)器留出更多的資源給此事件,默認(rèn)為1

          描述

          5

          年報表

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

          FeedBack:
          # re: OpenHandX-Batch1.0 快速部署手冊 2010-04-16 10:26 小山羊
          今天把AsynBatchConsole部署了,數(shù)據(jù)為oracle,數(shù)據(jù)也導(dǎo)入了,配置為
          <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"/>

          我選擇的是“節(jié)點圖編輯平臺”,登陸成功后,出現(xiàn)以下問題,我跟蹤了發(fā)現(xiàn)是從緩沖池讀取連接時,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}

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

          不知道是什么原因?  回復(fù)  更多評論
            
          # re: OpenHandX-Batch1.0 快速部署手冊 2010-04-16 11:37 小山羊
          調(diào)試到
          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())判斷時開始出現(xiàn)問題
            回復(fù)  更多評論
            
          # re: OpenHandX-Batch1.0 快速部署手冊 2010-04-20 19:58 彭明華
          @小山羊
          從錯誤的問題詳細(xì)信息看,是以下代碼出的問題
          Connection conn2 = (Connection)Proxy.newProxyInstance(
          conn.getClass().getClassLoader(),
          conn.getClass().getInterfaces(),this);
          可能是oracle驅(qū)動版本的問題,換個版本試試  回復(fù)  更多評論
            
          # re: OpenHandX-Batch1.0 快速部署手冊 2010-04-28 08:47 小山羊
          能不能提供一個jms得配置文件?  回復(fù)  更多評論
            
          # re: OpenHandX-Batch1.0 快速部署手冊 2010-04-29 11:06 小山羊
          在日志中發(fā)現(xiàn)的錯誤: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
            回復(fù)  更多評論
            
          # re: OpenHandX-Batch1.0 快速部署手冊 2010-05-06 09:07 彭明華
          @小山羊
          是這句話引起的錯誤
          select * from " + configParams.get("nodemaptable") + " where NODEMAPID=?
          由于配置文件的<nodeMap的params屬性中沒有配置 nodemaptable  回復(fù)  更多評論
            
          # re: OpenHandX-Batch1.0 快速部署手冊 2010-05-06 09:13 彭明華
          @小山羊
          <jms id="pvmsjms" url="tcp://192.168.1.247:61616" driver="org.activemq.ActiveMQConnectionFactory"/>  回復(fù)  更多評論
            
          # re: OpenHandX-Batch1.0 快速部署手冊 2012-09-17 16:56 wmj2003
          upst = cnn.prepareStatement("update " + configParams.get("table") + " set TASKID=TASKID where ID=" + id);  回復(fù)  更多評論
            
          # re: OpenHandX-Batch1.0 快速部署手冊 2012-09-17 16:58 wmj2003
          open.batch.taskserver.impl.message.DBTaskReceiver 中g(shù)etTask()方法的實現(xiàn)有問題,在集群環(huán)境中,多臺服務(wù)器獲取任務(wù)的是否在插敘的時候鎖表呢?  回復(fù)  更多評論
            
          # re: OpenHandX-Batch1.0 快速部署手冊 2012-09-17 17:00 wmj2003
          open.batch.taskserver.impl.message.DBTaskReceiver 中g(shù)etTask()方法的實現(xiàn)有問題,在集群環(huán)境中,多臺服務(wù)器獲取任務(wù)的時候,是否需要鎖表呢?  回復(fù)  更多評論
            
          # re: OpenHandX-Batch1.0 快速部署手冊 2012-10-31 09:19 彭明華
          @wmj2003
          最近再忙另外一個項目,很少上blog,抱歉.
          upst = cnn.prepareStatement("update " + configParams.get("table") + " set TASKID=TASKID where ID=" + id);
          就是一個鎖表記錄操作,鎖完后再查詢狀態(tài)RECTIME,就能保證多臺服務(wù)器獲并發(fā)時任務(wù)不會重復(fù)被執(zhí)行  回復(fù)  更多評論
            
          # re: OpenHandX-Batch1.0 快速部署手冊 2012-11-22 10:29 wmj2003
          @彭明華
          看明白了,呵呵,我也忘記早給你回復(fù)。以前都是通過查詢鎖表實現(xiàn)的。這也是一種好方法,多交流。  回復(fù)  更多評論
            

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 昌邑市| 彩票| 家居| 枝江市| 博湖县| 交城县| 宜兰市| 凉山| 颍上县| 师宗县| 海城市| 拜泉县| 徐汇区| 胶州市| 峡江县| 九寨沟县| 务川| 南江县| 郑州市| 武清区| 宽城| 隆子县| 紫金县| 博客| 电白县| 定兴县| 遂川县| 石林| 伊川县| 松潘县| 沽源县| 旌德县| 宜宾市| 白城市| 康定县| 剑河县| 牟定县| 贵定县| 曲水县| 大安市| 依兰县|