Hello Big Tiger with Terracotta

0

源起

看到這篇 Terracotta 介紹 後,想要試試,當我們同在一起,是否其快樂無比,做法是將兩隻老虎 (Java5) 變成一隻大老虎看看。

Terracotta 官方網站 以及這篇練習的 Hello 範例 參考。

DSO Server Node

先從 DSO 版本下手,下載 windows/linux 版約50MB 來用,這個安裝有自帶一個 JRE,所以不裝 JRE 也可以用,windows 裝完大約在 C:\Program Files\Terracotta\terracotta-2.2 可以找到。

因為要不同機器執行,和範例的本機執行有差別,要改一下東西才能跑。

先複製 \dso\config-sample\tc-config-dso.xml 為 tc-config-hello.xml。 改 /tc:tc-config/servers/server[@name and @host] 為 windows 機器的 ip。

start-tc-server.bat" -f ..\config-sample\tc-config-hello.xml

這個 tc-server 會啟動一個 HTTP 服務可以看輸出的訊息,例如啟動在 9510。

  1. http://192.168.111.194:9510/ 會對應到 C:\Program Files\Terracotta\terracotta-2.2 目錄。
  2. http://192.168.111.194:9510/config 輸出整個設定 XML,這個檔是關鍵。

JMX 的部份可以直接開 AdminConsole.exe 來看。

Tiger 1 DSO Client Node

這次要測的 HelloWorld 類似一張黑板,每個人(JVM)上去寫現在日期(執行一次)後, 大家都可以看到內容。

利用之前的 tiger1 當 Client Node 的環境,參閱 Hello Two Tigers

客戶端更簡單,不需要設定檔,直接在網路上抓 server node 的執行就可以。

/dso/bin/dso-java.sh -Dtc.config=http://192.168.1.9:9510/config tutorial.HelloWorld

tiger2 如法炮製,只要裝好 terracotta 後,將 java 換成 dso-java 並註明一下 server node 設定檔就可以多一台,接下部署要幾台有幾台。

保存

萬一 server node 關掉,狀態需要保存,就需要加個設定,將資料放在檔案中。

<persistence>
    <mode>permanent-store</mode>
 </persistence>

這樣可以不需要資料庫也可以保存狀態。只是兩種存放可能都是必須的,舉例來說,一張下午飲料訂購單上,傳來傳去,刪刪減減中,突然停電,這時狀態保留在 server node,開機後繼續傳閱填單子,最後負責人要保留這張單子並副本給飲料店。

這時候應該還是需要某種 ORM 將單子存到 DB 來保存,方便以後查詢。

飲料單可能是半天,員工旅行或是意見單前前後後也許要幾星期,不能保持狀態在 server node 實在太危險,這類延續數天數星期的事件,中間是否需要保留到 DB ,多久保留一次都是需要觀察的問題。

至於是否可以就讓這張單子一直躺在 server node ? 可能還需要時間檢視,完全不用 DB 來保存是否會有其他問題。

關於 一直躺著的問題 有人提到,雖說還不到某種 OODB 的實現,目前要做到的狀況跟現實差不多,現實需要一個 放在角落的櫃子來放這些單子,如果這個櫃子不是用 ORM 連結展示的 DB,就必須是某種櫃子物件,這樣才有連結 reference 可以找到其中放置的單子來取資料。

換句話說,保存搜尋的這個過程中,你要查閱某張單子,都需要先找到放的容器來找,暫時性的也許是承辦人的抽屜 (DSO) ,永久性也許是地下室架上的櫃子 (DB TABLE)。

不用 Terracotta

下面列舉想到的一些做法,可能需要考慮用資料庫或是某種保存程式來存放狀態,並提供同步所有點的即時物件狀態查詢。

  1. object-JDBC-DB-JDBC-object
  2. object-ORM-DB-ORM-object
  3. object-OXM-SOAP-WS-SOAP-OXM-object

觀察

  1. 在 windows 平台,一開起 start-tc-server.bat 會立刻吃掉近 250MB 記憶體,改一下 Xms64m Xmx128m 才能在小機器玩一下。
  2. 因為具有所謂的穿透性,說明程式不用改,可以直接在數十台直接部署,新增物件時,到 server node 改一下 tc-config.xml 就可以。
  3. server node 很像物件即時狀態交換中心,效率與同步衝突等等議題還有待練習觀察。
  4. JVM network 是個星狀網路,連結是採用 TCP/IP ,需要一直保持連線,如果斷掉連線 再回來,會回復到目前最新狀態。

Hello Two Tigers

0

源起

兩隻老虎跑的快,這次需要兩隻老虎(JRE5)在不同山(OS)上,用之前做過一陣子的 Slax 練習延伸出來,同時改用 SLAX 5.1.8 正式版。

參閱 Native Tomcat in SLAX 或是 SLAX Popcorn in vmplayer

先搬一座山

首先要到網路邊的 SLAX 網站搬來一座山 SLAX Popcorn Edition v 5.1.8, 這裡是下載 slax-popcorn-5.1.8.iso。

http://www.slax.org/download.php

找塊地

再來裝個建一座山的基地,這裡因為在 windows 上跑,就用 VMware Player 來當 基地。

http://www.vmware.com/products/player/

http://www.slax.org/forum/viewtopic.php?t=7338

http://software.newsforge.com/article.pl?sid=06/05/16/1940214

找點土

這座山本身很硬都是石頭,不長東西,於是接下來你還需要一些土(硬碟),讓老虎有地方住。

http://www.easyvmx.com/downloads.shtml

找人整理一下

有了 iso/vmdk 原料,就可以寫個 tiger1.vmx 文字檔來將這些東西黏起來。

guestOS = "linux" 
displayName = "tiger1" 
config.version = "7" 
memsize = "256" 
ide0:0.present = "TRUE" 
ide0:0.fileName = "500MB.vmdk" 
ide1:0.present = "TRUE" 
ide1:0.fileName = "slax-popcorn-5.1.8.iso" 
ide1:0.deviceType = "cdrom-image" 
floppy0.present = "FALSE" 
Ethernet0.present = "TRUE" 
ethernet0.addressType = "generated" 

這些材料放一起(同目錄)後,直接按兩下 vmx 檔,應該就會跑起來。

整土

開始規劃硬碟,並測試,注意 player 認為有硬碟就會從硬碟開,但是系統放在 iso 中, 所以規劃硬碟後第一次啟動要改 biso (F2) 將 CDROM 啟動放前面。

  1. dmesg | grep hda
  2. fdisk /dev/hda
  3. n p 1 enter enter w
  4. mke2fs /dev/hda1
  5. mkdir /mnt/hda1
  6. reboot

山在哪裡 ?

  1. ifconfig
  2. netstat -at
  3. chmod +x /etc/rc.d/rc.sshd
  4. /etc/rc.d/rc.sshd start
  5. netstat -at

放隻老虎

可以下載 slackware 來裝比較快。

http://packages.slackware.it/search.php?v=current&t=1&q=jdk

  1. scp jdk-1_5_0_09-i586-1.tgz to tiger1 /mnt/hda1
  2. cd /mnt/hda1
  3. tgz2mo jdk-1_5_0_09-i586-1.tgz jdk-1509.mo
  4. uselivemo jdk-1509.mo
  5. /usr/lib/java/bin/java -version

其實安裝過程有裝 /etc/profile.d/jdk.sh 不過一開始沒有啟用這個 jdk mo 所以無法幫忙 設定路徑。

調整一下

主要是啟動 sshd 跟使用 jdk。

  1. mc -e /etc/rc.d/rc.local
  2. configsave /mnt/hda1/slaxconf.mo
  3. reboot
uselivemod /mnt/hda1/jdk-1509.mo
chmod +x /etc/rc.d/rc.sshd
/etc/rc.d/rc.sshd start

啟動過程會問要不要用自動找到的 slaxconf.mo,如果沒有按下確認,不會載入這個 slaxconf。

兩隻老虎兩座山

建立 tiger2 目錄,複製 iso/vmdk/tiger1.vmx,改個名字 tiger2.vmx,把 vmx 檔案中 後來 player 加的東西刪掉,按兩下啟動,記得第一次啟動要按 F2 改 bios 啟動順序, 啟動後會問是否要使用 /mnt/hda1/slaxconf.mo ,按 enter 就可以用了。

每次放老虎實在太煩了

先下載這個編輯程式。

http://myslax.bonsonno.org/download.php

再來取出之前作好的 jdk-1509.mo,開啟 myslax creator 放進去,再建立新的 ISO 檔來用。 這次的 ISO 檔不需要靠 /etc/rc.d/rc.local 手動起用 jdk。

接下來可以刪掉 /mnt/hda1/jdk-1509.mo,如果不需要啟動 sshd,可以連 slaxconf.mo 刪掉。

觀察

  1. tiger1 比較費工,接下來要幾台有幾台,裝起來很輕鬆。
  2. 將 jdk mo 寫到 iso 中會比較方便複製。

build.xml in haha.remix.foo

0

源起

之前包的 haha.remix.xxx 採用 Bundle-ClassPath: lib/xxx.jar 的做法,這樣比較快, 不過在採用端,eclipse 會發生 PDE 無法編譯的現象,猜是 jar 放在 jar 之中緣故, 於是改一下作法。

做法

就是解開重新包而已,同時修改 MANIFEST.MF 去掉 Bundle-ClassPath,這時候 如果有 Export-Package,會出現叉叉,只要將 eclipse 的 build path 加上 build/classes 就可以了。

<target name="unzip.jar">
  <delete dir="build/classes"/>
  <mkdir dir="build/classes"/>
  <unzip dest="build/classes">
    <fileset dir=".">
      <include name="lib/*.jar" />
    </fileset>
  </unzip>
</target>
<target name="make.bundle">
  <jar destfile="dist/haha.remix.foo-1.0.0.jar" 
      manifest="META-INF/MANIFEST.MF" 
      basedir="build/classes">
  </jar>
</target>

觀察

  1. 這裡用 ant 來處理這些工作,似乎 maven 也可以做,有機會再試看看。
  2. 做這些事有時非必要,如果已經提供現成的包,又可以解決,還是用現成的方便。

hello xmlbeans 2

0

源起

在 spring-osgi 練習中,使用 Apache Xmlbeans 來做 XML 的工作,這裡紀錄一些常見的問題。

java 5

加個 javasource 參數可以不用陣列,改回傳有型的 List,方便使用。

<xmlbean schema=”schemas” destfile=”dist/Schemas.jar” classgendir=”build” srcgendir=”src” javasource=”1.5” />

基本產出過程

ProjectDocument foodoc = 
ProjectDocument.Factory.newInstance();
ProjectType pj = foodoc.addNewProject();
ProfileType pf = pj.addNewProfile();
pf.setName("HAHA");
pf.setSummary("SUMMARY");

XmlOptions opts = new XmlOptions();
opts.setSavePrettyPrint();
// namespace 
HashMap suggestedPrefixes = new HashMap();        suggestedPrefixes.put(
"http://config.service.haha/ns/project", "so");
opts.setSaveSuggestedPrefixes(suggestedPrefixes);

foodoc.save(System.out, opts);

會輸出下列結果 :

<?xml version="1.0" encoding="UTF-8"?>
<so:project xmlns:so="http://config.service.haha/ns/project">
  <profile>
    <name>HAHA</name>
    <summary>SUMMARY</summary>
  </profile>
</so:project>

xpath

xpath 的支援有限,而且不同版本之間不是相當穩定, 採用的 namespace 方式似乎和文件本身有很大關係, 不支援屬性的比對來取出 id 小於 10 的原因還要再查。

String ns = "declare namespace pj='http://extremepattern.com/ns/project';";
// error $this/pj:project/pj:requirements/pj:summaryGoal;
// error $this/pj:project/pj:requirements;
// error $this/pj:project/requirements/summaryGoal[@id < 10];
String xpathStatement = ns + "$this//pj:project/requirements/summaryGoal";        
XmlObject[] queryResult = pinfo.getProjectDoc().selectPath(xpathStatement);

另外就是取出的物件並非拷貝版,任何更動都會改變原文件。

http://xmlbeans.apache.org/docs/2.0.0/guide/conSelectingXMLwithXQueryPathXPath.html

foreach

常常需要取出部份的符合條件的節點,可以用 xpath 或是自己 foreach 去取出來。

List<SummaryGoalType> summaryList = reqs.getSummaryGoalList();
List<SummaryGoalType> result = new ArrayList<SummaryGoalType>();        
for (SummaryGoalType type : summaryList) {
  if (type.getId() < 10 ) {
    result.add((SummaryGoalType) type.copy());
  }
}

和 xpath 相比,可以比較的方式更複雜,也可選擇取出複製版或是原始版, schema 變動反應 refactoring 需求時,編譯會直接出問題無法過,用 xpath 方式 需要用 unit test 去反應出來,編譯可能不會出問題。

srcgetidr

srcgendir 輸出的東西和 jar 的東西不一樣,只有使用產生的程式碼可以 編譯,但是執行時期會出現錯誤。

<target name="schmea.to.java">
<xmlbean schema="schemas" 
   destfile="schemas/haha.service.config.schemas.jar" 
   fork="false" 
   classpathref="supportlib.classpath" 
   javasource="1.5" srcgendir="xsdsrc" 
/>
</target>

所以在開發 bundle 時候,需要將 haha.service.config.schemas.jar 掛起來,等到要包裝時,再把 haha.service.config.schemas.jar 打散,一起放到 jar 根目錄去。

參考之前的做法 build-xml-in-haha-remix-foo

觀察

  1. 需要跟 JAXB 2.0 比較看看。

Older posts: 1 2 3