簡介
DB2 Everyplace 是 IBM 普適計算技術解決方案的重要組成部分, 通過 DB2 Everyplace 的支持, 一些移動性大的專業人員(如銷售人員, 審計員, 技術支持人員, 醫生)就能夠在辦公室以外的地方獲取他們所需要的重要數據。
該產品的亮點之一就是能夠很好地支持種類繁多的移動設備,本文將描述針對 MIDP 相關設備如何構建基於 DB2 Everyplace 的應用程序。
通過本文您將了解到下列內容:
MIDP 的基本概念
如何配置 DB2 Everyplace 同步服務器以使之提供對 MIDP 的支持
DB2 Everyplace 提供的 MIDP 客戶端應用接口及其范例代碼
開發測試環境
本文要求您安裝配置了開發基於 DB2 Everyplace的 MIDP 應用程序完整的開發環境(下面為最簡配置):
服務器:在該服務器中將安裝配置同步數據源和 DB2 Everyplace 同步服務器。
Windows 2K SP3 (本文的測試環境為英文版)
DB2 Universal Database Enterprise Edition V7.2 + FIXPACK9
WebSphere Application Server Advanced Enterprise Edition V4.0.2
DB2 Everyplace Enterprise Edition V8.1+FIXPACK2
注意:
實際大數據量使用中,同步數據源與 DB2 Everyplace 同步服務器不推薦部署在同一台服務器上,上述配置是測試環境,這使得開發測試時較為便利。
同步數據源可以采用諸如 DB2 UDB,Oracle,MS SQL Server 等多種數據源,但是 DB2 Everyplace 同步服務器所使用的數據庫系統只能采用上述 DB2 UDB V7.2+FIXPACK9,目前,DB2 Everyplace 同步服務器V8.1 不支持 DB2 UDB V8.1,同步數據源也同樣推薦使用 DB2 UDB V7.2.x。
移動設備:本文的測試環境主要覆蓋開發人員最常涉及的移動設備及相關模擬器。
PocketPC (本文的測試環境是 Compaq iPaq H3870,運行 PocketPC 2002 操作系統)
Palm OS (本文的測試環境是 Palm OS 4.0)
其它 MIDP 相關設備 (WTK V1.04 模擬器,WebSphere Studio Device Developer V5.5 附帶的 MIDP 模擬器)
在目標移動設備或相應模擬器上,您需要事先部署相應的 DB2 Everyplace 同步客戶端軟件和 WebSphere Micro Environment V5.5 作為 MIDP 客戶端程序的運行環境,針對不同種類的移動設備相關的安裝配置文件列表可在 WebSphere Studio Device Developer V5.5 聯機幫助中得到。
開發工作站:在開發工作站上,您應該采用 WebSphere Studio Device Developer V5.5 作為您的開發工具,它采用 WebSphere Micro Environment V5.5 作為其應用程序的運行測試環境。
WebSphere Studio Device Developer V5.0:簡稱WSDD,是 IBM 推出的一款專門針對移動設備開發的優秀的集成開發環境,它可以作為插件和 WebSphere Studio Application Developer 合成使用,目前其最新版本為 V5.0。
WebSphere Micro Environment V5.5:簡稱 WME,是 IBM 推出的基於 J2ME 規范的Java 嵌入式運行環境,其廣泛應用於各種類型的移動設備和嵌入式環境中,以此來為IBM DB2 Everyplace、IBM MQ Everyplace 等各種無線應用軟件提供統一的部署環境。目前,其最新版本為 V5.5。
本文旨在幫助讀者掌握如何構建基於 DB2 Everyplace 的 MIDP 應用程序。通過本文,您可以掌握針對 MIDP 相關設備,如何使用 IBM 最新的移動設備集成開發環境 WebSphere Studio Device Developer V5.0 和 WebSphere Micro Environment V5.5 運行測試環境進行基於 DB2 Everyplace 的移動設備應用程序開發。
MIDP 概述
本文不是專門講述 MIDP 開發技術的文章,因此默認為讀者對 MIDP 技術已有一定了解。
MIDP 的基本特點概述如下:Mobile Information Device Profile,定義了針對移動信息處理設備(主要指智能手機和一部分具有無線通信功能的PDA)的圖形界面,輸入和時間處理,持久性存儲,無線電話網絡連接之上的一些消息處理(例如短消息),安全等等 API,並且考慮到了移動信息設備的屏幕和內存限制。
開發基於 DB2 Everyplace 的 MIDP 應用程序
概述:由於 MIDP 相關設備種類繁多,及其特殊性,DB2 Everyplace V8.1 提供的該功能是在 Sun Wireless Toolkit 環境下開發部署,應用服務器首選推薦 apache Tomcat Version 4.0.x,目標設備是一些具備 MIDP 功能的手機設備。如果讀者的應用類似於此種情況,可以通過參看相關的產品文檔得到很多幫助,文檔列表如下:
bin %DSYINSTDIR%\\ClIEnts\\MIDP\\bin 包含一些能夠運行 WTK 模擬器的腳本
lib %DSYINSTDIR%\\ClIEnts\\MIDP\\lib 包含一些相關的庫文件
docs %DSYINSTDIR%\\ClIEnts\\MIDP\\doc 包含了一些相關的產品文檔
samples %DSYINSTDIR%\\ClIEnts\\MIDP\\samples 包含了一個范例應用程序
但本文所要討論的情況卻不是如此。作者在項目實踐中成功地測試基於 DB2 Everyplace 的 MIDP 應用程序運行在 WME5.5 環境下,應用服務器采用的是 WebSphere Application Server Advanced Enterprise Edition V4.0.2,目標設備采用的是 PocketPC 設備或是 Palm OS 設備,同時也在 WTK 提供的手機模擬器上經過測試。
服務器端安裝配置:
為了支持 MIDP 相關設備的同步客戶端順利工作,我們需要在 DB2 Everyplace 服務器上安裝相應的 Web 服務器軟件,目前 DB2 Everyplace 產品支持兩種 Web 服務器軟件:
WebSphere Application Server,Advanced Single Server Edition Version 4.x 或是後繼版本。
apache Tomcat Version 4.0.x 或是後繼版本。
作者在測試過程中采用的是 WebSphere Application Server Advanced Enterprise Edition V4.0.2,經過測試,是能夠正常工作的。
安裝配置遵循下列步驟:
運行 \\DB2Everyplace\\Server\\installableAPPS\\nt\\dsy_was40_install.bat,該腳本將在 DB2 Everyplace 同步服務器的 WebSphere 節點下創建應用程序服務器。
命令格式如下:
dsy_was40_install.bat "WAS_installation_directory" "WAS_node_name" "%DSYINSTDIR%" "%DSYSQLLIBINSTDIR%"
其中,WAS_installation_directory 是 WebSphere Application Server 的安裝目錄,WAS_node_name 是 WebSphere Application Server 節點名。
注:在實際使用中,常常會碰到 WAS V4 對應的服務 IBM_WS_Admin 服務無法啟動,這通常是由於 WAS 需要配置為使用 JDBC 2.0,設置步驟如下:
1)停止"DB2 UDB JDBC Applet Server 服務"
2)執行 DB2 UDB 對應目錄下的 SQLLIB\\Java12\\usejdbc2.bat,將 JDBC 升級為 2.0 版本
3)重新啟動"DB2 UDB JDBC Applet Server 服務"
這時,即可啟動 IBM_WS_Admin 服務。
安裝"IBM DB2 Everyplace 企業應用程序",並且重新生成 Web 服務器插件,該應用程序安裝在步驟 1 所創建的應用程序服務器之中。該過程較為普通,如讀者有疑問,請查閱相關手冊,這裡不再贅述。
通過步驟2,在"IBM DB2 Everyplace企業應用程序"安裝好之後,還需要對該應用服務器的相關設置進行配置。隨產品發布的安裝文檔中的設置是針對 WebSphere Application Server V5.x,這裡將針對 WebSphere Application Server V4.x 的配置進行說明。
選中"IBM DB2 Everyplace 企業應用程序"所在的應用服務器,在其屬性框內選擇服務頁,然後選擇 Web 容器服務,如下圖:
圖片看不清楚?請點擊這裡查看原圖(大圖)。
然後編輯其屬性:
設置該應用服務器所對應的端口號,默認為 9080。
然後再返回服務頁,選擇會話管理器服務,如下圖:
圖片看不清楚?請點擊這裡查看原圖(大圖)。
編輯其屬性:
選中 Enable URL rewriting,不要選中 Enable SSL ID tracking 和 Enable cookIEs。
修改好上述配置後及時點擊"更新",使得修改後的屬性得以保存。
當我們遵循上述三步安裝配置好該應用服務器和"IBM DB2 Everyplace 企業應用服務器",我們只是完成了應用服務器的框架,對於與 DB2 Everyplace 業務邏輯相關的 Servlet,還需要手工安裝配置。具體步驟如下:
將業務邏輯文件 ..\\DB2Everyplace\\ClIEnts\\MIDP\\lib\\FilterServlet.jar 復制到 ...\\DB2Everyplace\\WAS\\installableAPPS\\IBM_DB2_Everyplace.ear\\IBM_DB2_Everyplace.war\\WEB-INF\\lib 目錄下。
..\\DB2Everyplace\\WAS\\installableAPPS\\IBM_DB2_Everyplace.ear\\IBM_DB2_Everyplace.war\\WEB-INF\\web.XML 做如下修改:
在 servlet 描述區的相應位置加入下面的定義:
<servlet id="Servlet_20">
<servlet-name>MIDP Filter Servlet</servlet-name>
<servlet-class>com.ibm.mobileservices.servlet.ServletDriver</servlet-class>
</servlet>
在 servlet 映射區的相應位置加入下面的定義:
<servlet-mapping id="ServletMapping_20">
<servlet-name>MIDP Filter Servlet</servlet-name>
<url-pattern>/db2efilter/*</url-pattern>
</servlet-mapping>
在完成上述修改後,保存該配置文件,重起應用服務器。
在上述步驟均完成後,可以通過訪問下列地址來測試服務器是否安裝配置成功。
請在開發機上訪問 http://syncservername:9080/db2e/db2eFilter 來驗證服務器是否安裝配置成功,如果成功,將在浏覽器中看到下面信息:
圖片看不清楚?請點擊這裡查看原圖(大圖)。
客戶端運行環境:
為了在客戶端順利地運行相關應用程序,首先需要部署 WME5.5 到目標設備上,請查閱 WSDD 聯機文檔。
同步引擎客戶端接口:
DB2 Everyplace 為 MIDP 相關設備提供的同步引擎接口較為獨立,下面給出了在客戶端代碼中調用該同步引擎接口實現同步功能的基本步驟:
遵循下列步驟:
引入 DB2 Everyplace 同步服務的相關包
import com.ibm.mobileservices.isync.* ;
import com.ibm.mobileservices.isync.event.* ;
import com.ibm.mobileservices.isync.midp.* ;
實現接口 IsyncListener的eventIssued 方法,以便能夠在進行同步的同時捕捉到所有事件通知。
得到 MIDPISyncProvider 的實例。
從步驟 3 所得到的 Provider 實例中得到一個 synchronization service 的實例。
從步驟 4 所得到的 Service 實例中得到一個 configuration store 的實例。
從步驟 5 所得到的 configuration store 實例中得到一個 synchronization driver 的實例
注冊應用程序偵聽器,使得在程序運行過程中我們可以隨時獲知發生的事件。
對所有已激活的預訂集進行同步操作,同時不斷地檢查同步的返回值和狀態。
關閉並且釋放 MIDPISyncProvider 所申請的所有資源。
可以看出,DB2 Everyplace 客戶端所需要遵循的同步過程是嚴格按照一定順序和規范來進行的。
附件 1中提供了一段簡單的范例代碼告訴讀者如何在自己的代碼中實現最基本的同步操作。
本地數據存取接口:
MIDP 相關設備種類繁多,因此其采用的數據存儲和管理機制需要有足夠的跨平台,跨設備特性。通常其采用 RMS(Record Management System)來作為自己的數據存儲管理解決方案。
本文對 RMS 不做過多的敘述,如果讀者感興趣,可查閱其它 RMS 相關技術文檔。
DB2 Everyplace V8.1 這個版本在基礎的 RMS 接口規范架構上設計了更為簡單易用的本地數據存取接口,其核心即引入了對象 TableMetaData 來描述本地數據表模式。在移動設備上的本地數據中,每個 FastRecordStore 實例對應著傳統意義上的一張數據表。在這個 FastRecordStore 的開頭,記錄著該表的元數據,即對應的 TableMetaData 對象;並且提供了簡單易用的借口讓我們可以通過該對象中存儲的模式信息來對該 FastRecordStore 實例中的每條數據記錄進行操作。
下面是在您的客戶端 MIDP 應用程序中存取本地數據的基本開發步驟:
根據數據表的名字從同步服務提供者 MIDPISyncProvider 的實例中得到該數據表模式對象(TableMetaData)的實例。
打開或創建該數據表實例(FastRecordStore)。
根據該數據表實例和其模式對象,建立該數據表記錄索引,以便於高效存取數據。
在該數據表實例基礎上建立記錄列舉對象(FastRecordEnumeration),以便遍歷該數據表中各記錄。
遍歷數據表中記錄,根據模式對象(TableMetaData),作相關操作,這當中常常牽涉到
數據流操作,會經常使用下列 4 個類的相關操作:
ByteArrayInputStream
DataInputStream
ByteArrayOutputStream
DataOutputStream
注:
數據表對象(FastRecordStore)由兩部分組成,開頭是模式對象(TableMetaData),余下的部分是由各個數據記錄依次排列而成。在每條記錄的開始,有個標志字節(Flag Byte)來表示該記錄的編輯狀態,該字節初始為零(0000 0000),開發人員可以在代碼中根據實際需要將其設置為 ISync.ROW_ADDED,ISync.ROW_CHANGED,ISync.ROW_DELETED 等值,同步操作時 MIDP 同步引擎會根據每條記錄的標志位進行插入,更新,刪除等相應操作。在一條記錄當中,各個列的字段值會按照數據表模式中的先後順序依次排列。這當中有些字段的值可能允許為空,如果該字段值可以為空,則對於該字段值會首先是一個是否為空值的布爾類型標志位,開發人員可以通過 DataInputStream.readBoolean 來得到該值。如果該值為 True,則該字段為空,緊挨著的將是下個字段的值;如果該值為 False,則該字段為非空,緊挨著的將是該字段。 具體如何判斷使用可以在附件 2 中的范例代碼中得到。
有關幾種時間類型字段的特殊處理
Date 類型
Date 類型的字段在本地數據表中是以一個整型值來表示的,我們需要通過特殊的位操作來得到其中的年、月、日值。
int dt = din.readInt(); // 得到一個 Date 類型字段
int year = dt >> 16; // 解析出"年"的值
int mon = (dt >> 8) & 0xFF; // 解析出"月"的值
int day = dt & 0xFF; // 解析出"日"的值
Time 類型
Time 類型的字段在本地數據表中也是以一個整型值來表示的,我們需要通過特殊的位操作來得到其中的時、分、秒值。
int tm = din.readInt(); // 得到一個 Time 類型字段
int hour = tm >> 16; // 解析出"時"的值
int min = (tm >> 8) & 0xFF; //解析出"分"的值
int sec = tm & 0xFF; // 解析出"秒"的值
TimeStamp 類型
TimeStamp 類型的字段在本地數據表中是以一個 8 字節長度的 long 類型值來表示的,前 4 個字節存儲 Date 信息,後 4 個字節存儲 Time 信息。
long ts = dinr.readLong(); // 得到一個 TimeStamp 類型字段
int dt = (int) (ts >> 32); // 得到前 4 個字節
int year = dt >> 16; // 解析出"年"的值
int mon = (dt >> 8) & 0xFF; // 解析出"月"的值
int day = dt & 0xFF; // 解析出"日"的值
int tm = (int) (ts & 0xFFFF); // 得到後 4 個字節
int hour = tm >> 16; // 解析出"時"的值
int min = (tm >> 8) & 0xFF; //解析出"分"的值
int sec = tm & 0xFF; // 解析出"秒"的值
附件 2中提供了一段簡單的范例代碼告訴讀者如何在自己的代碼中實現最基本的數據存取操作。