Jeffrey's Sky

          Go with wind
          隨筆 - 14, 文章 - 1, 評論 - 15, 引用 - 0
          數(shù)據(jù)加載中……

          有關(guān)在eclipse上遠(yuǎn)程debug的問題。

             Java 提供了遠(yuǎn)程debug的功能,這確實是一件很好的事。它能夠幫助我們在一些沒有虛機的OS(比如HP,AIX,等等)下調(diào)試我們的程序。

             1.建立Remote debug的準(zhǔn)備工作。
              a.可以將這些在java命令行中的設(shè)置放到一個script中去。例子如下所示:
           
              java -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y  -classpath
              其中,“-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y”是必須的。suspend=y---表明是在程序啟動后hang在那個端口處并監(jiān)聽(如果設(shè)為n,則不會hang);address=8787---表明是在遠(yuǎn)端機器上的端口號。除此之外,在java后也可以添加java的系統(tǒng)環(huán)境變量,如-D等等。   
              b.在eclipse中可以通過設(shè)立一個remote debug的方式來建立這種連接。  
             2.遠(yuǎn)程調(diào)試時,局部變量的值無法Watch/Inspect問題的解決
              這實際上是由eclipse在build的時候,沒有將javac后的option -g加上去。只有當(dāng)加上 -g這個參數(shù)時,所有的調(diào)試信息才會被build到class文件中去。
              但ecipse沒有提供這樣在build時設(shè)置參數(shù)的user interface。所以,最好的方式就是寫一個Ant腳本。
              例子如下,

               <?xml version="1.0" encoding="UTF-8" standalone="no"?>
              <project basedir="." default="build" name="ssdv">
              <property name="build.location" value="../ssdv_build"/>
              <property name="debuglevel" value="source,lines,vars"/><!--必須的-->
              <property name="target" value="1.5"/>
              <property name="source" value="1.5"/>
              
              <target name="init">
                  <mkdir dir="bin"/>
              </target>
              
              
              <target name="clean">
                  <delete dir="bin"/>
              </target>
             
              <target depends="init" name="build-project">
                  <echo message="${ant.project.name}: ${ant.file}"/>

                  <javac debug="true" debuglevel="${debuglevel}" destdir="bin" source="${source}" target="${target}">  <!--必須的-->
                      <src path="."/>
                      <classpath refid="ssdv.classpath"/>
                  </javac>

              </target>
              
          </project>
             
               這樣,將生成的build工程拷貝到要測試的遠(yuǎn)程OS。啟動腳本,然后就可以看到local variables了。

          posted @ 2008-12-12 17:34 Jeffrey Feng 閱讀(817) | 評論 (0)編輯 收藏

          Drools 規(guī)則引擎的使用總結(jié)

              前一段時間在開發(fā)了一個做文本分析的項目。在項目技術(shù)選型的過程中,嘗試使用了Drools規(guī)則引擎。讓它來作為項目中有關(guān)模式分析和關(guān)鍵詞匹配的任務(wù)。但后來,因為某種原因,還是撇開了Drools。現(xiàn)將這個過程中使用Drools的一些經(jīng)驗和心得記錄下來。
          (一)什么時候應(yīng)該使用規(guī)則引擎
              這實際是一個技術(shù)選型的問題。但這個問題又似乎是一個很關(guān)鍵的問題(一旦返工的話,你就知道這個問題是多么重要了)。不知大家有沒有過這樣的經(jīng)驗和體會。往往在項目開始的時候,總會遇到應(yīng)該選用什么技術(shù)?是不是應(yīng)該使用最新的技術(shù)?或者應(yīng)該選用什么技術(shù)呢(PS:現(xiàn)在計算機軟件中的各種技術(shù)層出不窮,具有類似功能的技術(shù)很多)?
              不管怎么樣,這些問題總會困擾著我。比如,這次的這個項目。項目要求是要在一些log文件中(這些log文件都是很大的應(yīng)用系統(tǒng)所產(chǎn)生的,但由于legacy的原因,log本身的維護和規(guī)范工作一直沒有得到改善,所以想借助于一些外部應(yīng)用對這些log做以分析和清洗)抽取出有用的信息。
              于是,第一個想到的就是,這是一個文本挖掘類的項目。但又想,要抽取有用信息,必須得建立一些規(guī)則或pattern(模式)。所以,我第一個想到了規(guī)則引擎。因為這里面要建立好多規(guī)則,而這些規(guī)則可以獨立于代碼級別(放到一個單獨的drl文件里)并可以用規(guī)則引擎去解析和執(zhí)行。另一個重要的原因是,我原來用過,比較熟悉。這樣,也可以節(jié)省開發(fā)時間吧。于是,好不猶豫的就開始做了Demo....
              但事實上,在經(jīng)歷了一個多星期的編碼、測試后,我發(fā)現(xiàn)運用規(guī)則引擎實在是太笨拙了。
              (1)首先必須建立一些數(shù)據(jù)模型。通過這些模型來refer規(guī)則文件中的LHS和Action。
              (2)還要考慮規(guī)則的conflict。如果有一些規(guī)則同時被觸發(fā),就要考慮設(shè)定規(guī)則的優(yōu)先級或者是設(shè)定activiation-group來保證在一個group中的規(guī)則只有一個規(guī)則可以被觸發(fā)。
              (3)對于‘流’規(guī)則group ruleflow-group的使用。如果要控制在workingmemory中的規(guī)則被觸發(fā)的順序,則可以將這些規(guī)則分組。然后,通過規(guī)則建模的方式來實現(xiàn)。但這也添加了一定的effort。修改或者更新不大方便。
              所以,基于上述體會,我更認(rèn)為規(guī)則引擎更適用于那些對非流程性規(guī)則匹配的應(yīng)用。當(dāng)然,Drools也支持對流程性規(guī)則的建模過程。但,這也許不是最好的方式。
          (二)Drools規(guī)則引擎的使用雜記
              (1)Fact 的變更監(jiān)聽。在Drools里,如果一個Fact通過規(guī)則而改變,則需將這種改變通知給規(guī)則引擎。這里,一般有兩種方式:顯式和隱式。
                   顯式---在drl文件中通過 update、modify來通知;在程序中,通過Fact的引用調(diào)用modifyObject等方法來實現(xiàn)。
                   隱式---通過在java bean實現(xiàn)property Listener Interface來讓引擎自動監(jiān)聽到屬性值的變化。我更習(xí)慣于這種方式。因為,一般看來凡是在規(guī)則引擎中添加到fact都是希望引擎來幫你進(jìn)行管理的。所以,那它自己看到fact的變化是種很省事的辦法。也很簡單,就是用java bean property 監(jiān)聽的方式。
                   通過StatefulSession來注冊。
                   調(diào)用StatefulSession的某個instance 的insert(Object,true)實現(xiàn)。而這個object是一個java bean。其中,要實現(xiàn)
                
                  
          private final PropertyChangeSupport changes  = new PropertyChangeSupport( this );
              public void addPropertyChangeListener(final PropertyChangeListener l) {
                  this.changes.addPropertyChangeListener( l );
              }

              public void removePropertyChangeListener(final PropertyChangeListener l) {
                  this.changes.removePropertyChangeListener( l );
              }
            
                  然后在set方法中調(diào)用
              this.changes.firePropertyChange( "temp",null,this.temp );
               (2)規(guī)則觸發(fā)的優(yōu)先級、組設(shè)置
              往往,在設(shè)計我們自己的規(guī)則時,要考慮規(guī)則的觸發(fā)條件。這不僅限于LHS的條件部分,還有規(guī)則本身被觸發(fā)的有些設(shè)置等等。這里,列出一些比較常用和有效的規(guī)則優(yōu)先級設(shè)置方式,以及需要注意的地方。
                   A.通過Salience方式。此值可正可負(fù)。越大優(yōu)先級越高,也會被引擎首先執(zhí)行。
                   B.通過ruleflow-group 方式。實際上,使用這種方式也就是在使用建立規(guī)則流的方式。在Eclipse 3.3 中,Drools提供了建立規(guī)則流的插件。要在drl的同級目錄中建立rf和rfm兩個文件(當(dāng)然,插件會幫助你建立這些)。
                  
          選擇RuleFlow File。
                這里,需要注意的一點是要在啟動規(guī)則引擎的時候,加入啟動rule flow的代碼。

               InputStreamReader source = new InputStreamReader(RuleManager.class
                              .getResourceAsStream(rule_path));
                     PackageBuilder builder = new PackageBuilder();
                      builder.addPackageFromDrl(source);
                      builder.addRuleFlow(new InputStreamReader(RuleManager.class
                              .getResourceAsStream(rule_flow_path)));
                     Package pkg = builder.getPackage();
                      RuleBase ruleBase = RuleBaseFactory.newRuleBase();
                      ruleBase.addPackage(pkg);
                然后,在每次啟動規(guī)則引擎的時候,調(diào)用如下方法:

                      StatefulSession ss;
                      ss.startProcess(flowProgress);
                      ss.fireAllRules();

                      flowProgress 是一個string類型。這個flow的名字。

          這個rule flow圖中,顯示了一個簡單的規(guī)則流。如RSA就是一個rule-flow的名字。在這個rule set中可以設(shè)定一組rules。這樣,就可以分開規(guī)則執(zhí)行的順序。在于rf和rfm同名的另一個 drl文件中定義這些組的名字。通過關(guān)鍵字 ruleflow-group 來表明。
              C.通過activation-group的方式。通過這種方式,可以exclude一組rule中一旦有一個rule被invoke,而其它rule不會被execute。同時,可以搭配使用salience關(guān)鍵字來標(biāo)明每個rule的優(yōu)先級,這樣就能夠使得你想要的一般性概念的rule先被匹配執(zhí)行。
              D.在使用ruleflow-group 的時候要注意使用lock-on-active true 關(guān)鍵字在每個rule。這樣可以避免一旦有rule被觸發(fā),不會造成循環(huán)匹配執(zhí)行。
              E.如果在LHS部分,需要調(diào)用某個方法來返回真、假值作為判斷的一個條件,那么可以用eval函數(shù)。
              如,eval(pattern.matched(5,$line.getCurrLine()))
              其中,pattern是某個加入到workingmemory中的一個實例。matched是這個實例所代表類的一個方法。它返回boolean類型。
             
            (3)Drools規(guī)則引擎的使用感受
             
          總之,Drools還是一個很不錯的開源規(guī)則引擎。現(xiàn)在v4.0以上的版本已經(jīng)比以前的版本在速度上有了很大的提升。可以作為我們一般應(yīng)用程序系統(tǒng)的中間件產(chǎn)品(那些規(guī)則不是很經(jīng)常改變的系統(tǒng),已經(jīng)非流程類規(guī)則)。但是,這其中還是需要一些額外的effort來學(xué)習(xí)它的使用文檔以及整體架構(gòu),有一定的學(xué)習(xí)曲線。
            
              最后,我想一個較好的對于技術(shù)使用的practice就是:首先知道它能為你做什么,它最好的應(yīng)用領(lǐng)域,然后再去深入。
             
              (PS:如果誰有使用Drools的問題,可以聯(lián)系我!一起討論!)

               
              

          posted @ 2008-11-04 14:19 Jeffrey Feng 閱讀(13644) | 評論 (13)編輯 收藏

          Db2 catalog(編目)(轉(zhuǎn))

          在DB2數(shù)據(jù)庫中,編目(catalog)這個單詞很難理解,我自己當(dāng)初在學(xué)習(xí) DB2的時候也常常被這個編目搞的很不明白,直到現(xiàn)在我個人也感覺到DB2中編目(catalog)這個術(shù)語用的不是很好,具體來說編目有編目節(jié)點,編目 數(shù)據(jù)庫等如果要理解編目我先簡單講一下DB2數(shù)據(jù)庫的體系結(jié)構(gòu),在DB2數(shù)據(jù)庫中最大的概念是系統(tǒng)(節(jié)點)也就是主機,下面是實例,實例下面是數(shù)據(jù)庫,然 后是表空間,然后是數(shù)據(jù)庫對象。現(xiàn)在假設(shè)你有一個數(shù)據(jù)庫服務(wù)器在p570的機器上,你有一個客戶端在windows,linux或任何平臺上,你現(xiàn)在想建 立一個客戶端到服務(wù)器端的連接,具體步驟是什么呢?
          第一步:
          你必須要在客戶端的機器上能夠把遠(yuǎn)程的服務(wù)器能夠識別出來,這個具體如何來做呢?Oracle中可以用SQL*NET配置,SYBASE中用OPEN CLIENT;而在DB2使用的編目(catalog)方式,具體來說就是通過編目把遠(yuǎn)程的服務(wù)器寫在本地客戶端的一個文件中:
          db2 catalog tcpip node p570 remote 172.10.10.10 server 50000
          在上面的這條命令中p570是一個節(jié)點名(在一個機器上必須是唯一的),remote后面是服務(wù)器的IP地址,server是遠(yuǎn)程服務(wù)器上實例對應(yīng)的端口號
          DB2通過這種方式在本地的SQLNODIR文件中把遠(yuǎn)程服務(wù)器的信息記錄下來
          所以編目節(jié)點其實就是把遠(yuǎn)程服務(wù)器映射到本地,通過SQLNODIR中的記錄能夠找到遠(yuǎn)程服務(wù)器和實例,類似指向遠(yuǎn)程服務(wù)器和實例的地址指針
          第二步:
          當(dāng)把遠(yuǎn)程的服務(wù)器IP地址,實例編目下來后,第二步應(yīng)該把該實例下的數(shù)據(jù)庫編目到本地
          db2 catalog db REMOTEDB at node p570
          在這條命令中,REMOTEDB是遠(yuǎn)程實例下的數(shù)據(jù)庫,p570是我們在第一步中編目的節(jié)點名
          這條命令執(zhí)行后會在本地SQLDBDIR文件中記錄遠(yuǎn)程數(shù)據(jù)庫的信息,這這里編目數(shù)據(jù)庫可以理解為把遠(yuǎn)程服務(wù)器實例下的數(shù)據(jù)庫映射到本地為一個別名
          =========================
          上面是客戶端和服務(wù)器不在同一臺機器上,是通過編目節(jié)點,編目數(shù)據(jù)庫來實現(xiàn)客戶端連接到服務(wù)器上數(shù)據(jù)庫的目的,如果是連接在同一臺機器上,那么這時候不要 顯示的編目節(jié)點,但是在服務(wù)器上當(dāng)我們創(chuàng)建一個實例的時候,有一個隱含的把實例在本地編目的過程,假設(shè)在p570上創(chuàng)建一個實例名為db2inst1,其 實有一個隱含的
          db2 catalog local node db2inst1 instance db2inst1 system p570 ostype aix的步驟,
          同樣當(dāng)你在db2inst1下創(chuàng)建一個數(shù)據(jù)庫MYDB的時候,有一個隱含的編目(catalog)數(shù)據(jù)庫的步驟:
          db2 catalog db mydb at node db2inst1的步驟
          至此你可以這樣理解編目(catalog),編目就是在本地或遠(yuǎn)程建立客戶端到服務(wù)器的數(shù)據(jù)庫連接的目的,他類似Oracle數(shù)據(jù)庫中的通過 SQL*NET或netca配置客戶端到服務(wù)器的連接;類似SYBASE中的OPEN CLIENT;類似informix中Iconnect

          http://blog.csdn.net/fxxxgxxx/archive/2007/08/27/1760999.aspx

          posted @ 2008-10-23 16:50 Jeffrey Feng 閱讀(933) | 評論 (0)編輯 收藏

          Eclipse 插件開發(fā)中的 classnotfound 問題(轉(zhuǎn)載)

          目的Eclipse插件開發(fā)中,經(jīng)常要引用第三方包或者是引用其他插件中的類,由于插件開發(fā)環(huán)境引用類路徑的設(shè)置和運行平臺引用類路徑的設(shè)置不同,經(jīng)常導(dǎo)致開發(fā)過程OK,一旦運行則出現(xiàn)NoClassDefFoundError的問題。本文的目的是全面分析各種情況下類路徑的設(shè)置,以避免這個問題的出現(xiàn)。

           

          說明Jar包和類路徑實際上是一個概念,比如類com.bbebfe.Test.class打包為test.jar包,添加類引用就直接添加test.jar包。而如果是添加類文件路徑,則添加包目錄的上級目錄,比如lib/com/bbebfe/Test.class,則添加lib文件夾,而不是com文件夾。在此后的例子中都只說明Jar包的形式。

           

          分析Eclipse插件開發(fā)對于Jar包的引用主要有三種原因:

          1. 插件引用第三方包(普通的jar包或者類文件,不是插件)。

          a)        開發(fā)環(huán)境引用配置,在prject -> properties -> Java build path中設(shè)置。

          b)        運行環(huán)境引用配置,在plugin manifest編輯器的Runtime選項卡下的classpath中添加tset.jar包的引用(在MANIFEST.MF中表現(xiàn)為Bundle-ClassPath: lib/test.jar, plugin.xml表現(xiàn)為<runtime>節(jié)下的引用

                                   i.  類文件在lib目錄下,如下的設(shè)置導(dǎo)出lib目錄下所有目錄:

          <runtime>

                      <library name="lib/">

                       <export name="*"/>

                      </library>

             </runtime>

                                 ii.  test.jarlib目錄下:

                  <runtime>

                      <library name="lib/test.jar">

                       <export name="*"/>

                      </library>

             </runtime>

                                iii.  實際上上面的設(shè)置可以簡化為:

          <runtime>

                      <library name="lib/"/>

             </runtime>

              或者

          <runtime>

                      <library name="lib/test.jar"/>

             </runtime>

                 默認(rèn)即導(dǎo)出lib目錄下的所有包和jar下的所有包

                 實際上,執(zhí)行b)項設(shè)置后,會自動執(zhí)行a)項設(shè)置,使開發(fā)環(huán)境和運行環(huán)境同時有效。

          2. 插件B引用插件工程A(非Eclipse插件,而是自己另外一個插件項目中的類)

          a)        首先必須將A中的B需要的類暴露(export)出來

                                   i.              如果有MANIFEST.MF文件,則表現(xiàn)為plugin manifest編輯器中runtime節(jié)的exported packages,通過這里添加需要export的包。在manifest.mf文件中是Export-Package: com.bbebfe

                                 ii.              如果只有plugin.xml,則表現(xiàn)為plugin manifest編輯器中runtime節(jié)的library visibilityplugin.xml文件中表現(xiàn)為

          <runtime>

                 <library>

                        <export name=”com.bbebfe.*”/>

                 ...

          b)        B插件工程的plugin manifest編輯器中的dependencies選項卡中添加對A插件的引用(這要求運行對話框中的plugins列表的workspace plugins中必須包含A插件)。

          c)         如果B工程是一個RCP工程,則必須在product編輯器的configuration選項卡中包含A插件工程。

          3. 插件B引用Eclipse插件A的類。

          a)        Eclipse插件中的類都是Exported,因此這步省略。

          b)        B插件工程的plugin manifest編輯器中的dependencies選項卡中添加對A插件的引用(這要求preferences -> plugin development -> target目標(biāo)平臺必須包含A插件,且運行對話框的plugins列表中的target platform中必須選中A插件)。

           

          總結(jié):如果B插件引用的A也是一個插件,則A必須出現(xiàn)在B插件的plugin dependencies引用中,而不是其他地方,否則肯定會出現(xiàn)運行時NoClassDefFoundError問題(因此必須在plugin manifest編輯器的dependencies選項卡下進(jìn)行設(shè)置)。而且只需要在這里設(shè)置的設(shè)置對開發(fā)環(huán)境和運行環(huán)境同時有效)

           

          注意:還有一種情況就是開發(fā)環(huán)境沒有某個包或者插件,而只在運行環(huán)境(target)中存在,此時就必須設(shè)置正確的target,然后按照正常程序添加插件引用,但此時已經(jīng)不能在plugin manifestdependencies選項卡中設(shè)置(因為在開發(fā)環(huán)境找不到這個plugin),而必須在plugin.xmlMANIFEST.MF文件中手工設(shè)置。plugin只要target中存在該插件,則開發(fā)和運行也不會有問題。

          posted @ 2008-10-14 10:19 Jeffrey Feng 閱讀(1352) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共2頁: 上一頁 1 2 
          主站蜘蛛池模板: 揭东县| 高州市| 洪雅县| 西华县| 南溪县| 海丰县| 尉氏县| 宜丰县| 岳普湖县| 白玉县| 阿拉善盟| 长泰县| 赫章县| 修文县| 瓮安县| 抚远县| 延寿县| 突泉县| 沁阳市| 临城县| 高雄市| 西昌市| 高清| 永顺县| 禹城市| 外汇| 荔浦县| 台湾省| 泗洪县| 永顺县| 元阳县| 永寿县| 涿州市| 乌鲁木齐县| 库车县| 墨竹工卡县| 安康市| 大姚县| 寻乌县| 双鸭山市| 衡水市|