Jeffrey's Sky

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

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

             Java 提供了遠(yuǎn)程debug的功能,這確實(shí)是一件很好的事。它能夠幫助我們?cè)谝恍]有虛機(jī)的OS(比如HP,AIX,等等)下調(diào)試我們的程序。

             1.建立Remote debug的準(zhǔn)備工作。
              a.可以將這些在java命令行中的設(shè)置放到一個(gè)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---表明是在程序啟動(dòng)后hang在那個(gè)端口處并監(jiān)聽(如果設(shè)為n,則不會(huì)hang);address=8787---表明是在遠(yuǎn)端機(jī)器上的端口號(hào)。除此之外,在java后也可以添加java的系統(tǒng)環(huán)境變量,如-D等等。   
              b.在eclipse中可以通過設(shè)立一個(gè)remote debug的方式來建立這種連接。  
             2.遠(yuǎn)程調(diào)試時(shí),局部變量的值無法Watch/Inspect問題的解決
              這實(shí)際上是由eclipse在build的時(shí)候,沒有將javac后的option -g加上去。只有當(dāng)加上 -g這個(gè)參數(shù)時(shí),所有的調(diào)試信息才會(huì)被build到class文件中去。
              但ecipse沒有提供這樣在build時(shí)設(shè)置參數(shù)的user interface。所以,最好的方式就是寫一個(gè)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工程拷貝到要測(cè)試的遠(yuǎn)程OS。啟動(dòng)腳本,然后就可以看到local variables了。

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

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

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

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

                      flowProgress 是一個(gè)string類型。這個(gè)flow的名字。

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

               
              

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

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

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

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

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

           

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

           

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

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

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

          b)        運(yùn)行環(huán)境引用配置,在plugin manifest編輯器的Runtime選項(xiàng)卡下的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í)際上上面的設(shè)置可以簡(jiǎn)化為:

          <runtime>

                      <library name="lib/"/>

             </runtime>

              或者

          <runtime>

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

             </runtime>

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

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

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

          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選項(xiàng)卡中添加對(duì)A插件的引用(這要求運(yùn)行對(duì)話框中的plugins列表的workspace plugins中必須包含A插件)。

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

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

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

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

           

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

           

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

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

          僅列出標(biāo)題
          共2頁: 上一頁 1 2 
          主站蜘蛛池模板: 五家渠市| 伊川县| 时尚| 仙桃市| 合山市| 将乐县| 泰来县| 安国市| 贵德县| 朔州市| 衡水市| 丹东市| 晋城| 和林格尔县| 奉节县| 蕲春县| 合江县| 江油市| 永嘉县| 三河市| 金川县| 宝丰县| 定兴县| 白朗县| 庆安县| 乌兰县| 绍兴县| 宣汉县| 宝坻区| 沙坪坝区| 朝阳市| 广州市| 三河市| 天台县| 固镇县| 阳东县| 茂名市| 息烽县| 嘉禾县| 龙川县| 德阳市|