ESP-iSYS平臺(tái)開(kāi)發(fā)JAVA實(shí)時(shí)應(yīng)用系統(tǒng)
時(shí)間:2008-04-25 14:42:00來(lái)源:dujing
導(dǎo)語(yǔ):?實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)作為現(xiàn)代信息系統(tǒng)的核心,是企業(yè)級(jí)應(yīng)用的實(shí)時(shí)數(shù)據(jù)中樞,通過(guò)該系統(tǒng),上層應(yīng)用系統(tǒng)(如 ERP 系統(tǒng)),可以獲得良好的實(shí)時(shí)統(tǒng)計(jì)數(shù)據(jù)和實(shí)時(shí)統(tǒng)計(jì)信息的支撐。
實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)作為現(xiàn)代信息系統(tǒng)的核心,是企業(yè)級(jí)應(yīng)用的實(shí)時(shí)數(shù)據(jù)中樞,通過(guò)該系統(tǒng),上層應(yīng)用系統(tǒng)(如 ERP 系統(tǒng)),可以獲得良好的實(shí)時(shí)統(tǒng)計(jì)數(shù)據(jù)和實(shí)時(shí)統(tǒng)計(jì)信息的支撐。隨著SUPCON實(shí)時(shí)數(shù)據(jù)庫(kù)在現(xiàn)代企業(yè)信息化建設(shè)當(dāng)中得到了越來(lái)越廣泛的應(yīng)用,不但對(duì)WINDOWS平臺(tái)上主流編程語(yǔ)言提供了良好的支持,而且在ESP-iSYS4.0版本中為Java語(yǔ)言的開(kāi)發(fā)提供了JRtdbc接口庫(kù),該接口在Jdk1.5平臺(tái)上開(kāi)發(fā),其良好的面向?qū)ο笤O(shè)計(jì)與實(shí)現(xiàn)帶來(lái)了每秒訪問(wèn)磁盤(pán)數(shù)據(jù)50000點(diǎn)以上的高性能,最大化的滿(mǎn)足了工業(yè)實(shí)時(shí)應(yīng)用性能需求,在符合Java純面向?qū)ο蟮木幊田L(fēng)格的同時(shí),又打破了Java語(yǔ)言低效的束縛,以JRtdbc為橋梁,應(yīng)用Java語(yǔ)言可以方便快速的開(kāi)出各種優(yōu)秀的實(shí)時(shí)應(yīng)用。通過(guò)閱讀本文,讀者不僅能用JRtdbc進(jìn)行java實(shí)時(shí)應(yīng)用的開(kāi)發(fā),而且能夠充分體會(huì)到JRtdbc提供的簡(jiǎn)單快速開(kāi)發(fā)的優(yōu)越性。
一 系統(tǒng)結(jié)構(gòu)
整個(gè)JRtdbc的對(duì)象層次結(jié)構(gòu):
[align=center]

系統(tǒng)總體結(jié)構(gòu)圖 -1[/align]
如上UML圖,實(shí)時(shí)數(shù)據(jù)庫(kù)當(dāng)中的對(duì)象體系被明確的映射到了JRtdbc中,隱藏了實(shí)時(shí)數(shù)據(jù)庫(kù)的一些艱澀的概念,其中IConnectionPool為連接池,類(lèi)似于jdbc的數(shù)據(jù)庫(kù)連接池,也是用JRtdbc進(jìn)行開(kāi)發(fā)時(shí)第一個(gè)要獲得的對(duì)象,可以通過(guò)其獲取實(shí)時(shí)數(shù)據(jù)庫(kù)連接IConnection,實(shí)時(shí)數(shù)據(jù)庫(kù)連接聚合了系統(tǒng)的四個(gè)核心工廠
名稱(chēng) 功能
ITagFactory 獲取位號(hào)/位號(hào)組實(shí)例。
IUserFactory 添加刪除枚舉用戶(hù)/用戶(hù)組。
ITypeFactory 添加刪除枚舉對(duì)象類(lèi)型。
IRegion getRegionRoot() 獲取對(duì)象樹(shù)根節(jié)點(diǎn),遍歷實(shí)時(shí)數(shù)據(jù)庫(kù)對(duì)象樹(shù)
通過(guò)工廠方法,可以得到實(shí)時(shí)數(shù)據(jù)庫(kù)的四大功能模塊,位號(hào)與位號(hào)組;用戶(hù)與用戶(hù)組;對(duì)象類(lèi)型與權(quán)限體系;整個(gè)實(shí)時(shí)數(shù)據(jù)庫(kù)對(duì)象樹(shù)的訪問(wèn)與操作;設(shè)計(jì)一致而且清晰,讓開(kāi)發(fā)人員更容易理解與使用,下面逐一進(jìn)行介紹并講解使用方法。
二 使用方法
實(shí)時(shí)數(shù)據(jù)庫(kù)連接的建立
JRtdbc提供了連接池工廠PoolFactory,包含二個(gè)工廠方法:
IConnectionPool getPool() ; Œ
IConnectionPool getPool(int poolLength,int timeout) ;
其中工廠方法Œ用于構(gòu)建默認(rèn)參數(shù)配置的連接池實(shí)例,工廠方法允許用戶(hù)自定義連接池配置,參數(shù)poolLength定義為連接池連接上限,如果池中未達(dá)到上限,有新連接請(qǐng)求,直接新建連接放入池中返回,如已達(dá)上限,則償試重登錄其他用戶(hù)空閑連接,無(wú)空閑連接存在則進(jìn)入阻塞狀態(tài)直到有連接釋放,從而保證了系統(tǒng)不會(huì)無(wú)限制地增加并發(fā)連接并且可以充分利用空閑連接。參數(shù)timeout定義為連接池中的連接空閑達(dá)到一個(gè)給定的毫秒數(shù)后就自動(dòng)釋放連接,從而進(jìn)一步節(jié)省實(shí)時(shí)數(shù)據(jù)庫(kù)連接資源。IConnectionPool 連接池接口,通過(guò)getConnection(String conStr)方法獲取一個(gè)與實(shí)時(shí)數(shù)據(jù)庫(kù)之間的連接IConnection。JRtdbc連接池經(jīng)過(guò)專(zhuān)門(mén)設(shè)計(jì),用戶(hù)只須獲得連接,像普通對(duì)象一樣調(diào)用,無(wú)須考慮底層連接狀態(tài),完全由連接池托管,擺脫了像Jdbc那種獲得連接后還要時(shí)時(shí)不忘c(diǎn)lose()的那種煩惱,降低了使用復(fù)雜度。如何獲取實(shí)時(shí)數(shù)據(jù)庫(kù)連接?
//首先獲得連接池實(shí)例,能過(guò)連接字符串得到連接IConnection實(shí)例
IConnectionPool pool = PoolFactory.getPool();
IConnection conn = pool.getConnection( String conStr ) ;
連接字符串格式:
host:192.168.0.171:5051;user=xxxxxx;password=xxxxxx;
其中各字段具體含義如下:
字段 含義
host 為實(shí)時(shí)數(shù)據(jù)庫(kù)所在計(jì)算機(jī)的IP和端口,其中,前xxx.xxx.xxx.xxx指一個(gè)4段式IP地址,“:”后為實(shí)時(shí)數(shù)據(jù)庫(kù)的端口地址
user 用戶(hù)名,有效內(nèi)容為大小寫(xiě)英文字母、下劃線
password 密碼,有效內(nèi)容為大小寫(xiě)英文字母、數(shù)字、下劃線、連字符
如果建立連接成功,則返回一個(gè)有效的IConnection對(duì)象實(shí)例,如果在連接建立過(guò)程中存在異常情況,則拋出IOException類(lèi)型的異常。
位號(hào)與位號(hào)組
位號(hào)是存儲(chǔ)在實(shí)時(shí)數(shù)據(jù)庫(kù)當(dāng)中的數(shù)據(jù)點(diǎn),對(duì)應(yīng)底層控制系統(tǒng)的數(shù)據(jù)源,通過(guò)JRtdbc曝露給用戶(hù)的只是一個(gè)簡(jiǎn)單的ITag對(duì)象,調(diào)用其方法即可對(duì)位號(hào)/位號(hào)組進(jìn)行操作,工業(yè)現(xiàn)場(chǎng)的控制設(shè)備,在提供數(shù)值的同時(shí),也提供了對(duì)數(shù)值質(zhì)量的判斷,所以,實(shí)時(shí)數(shù)據(jù)庫(kù)中的數(shù)據(jù)是有質(zhì)量碼的,通過(guò)質(zhì)量碼,可以確定讀回的值是否可信、可用。在通常的應(yīng)用中,驗(yàn)證質(zhì)量碼是缺省的,當(dāng)出現(xiàn)錯(cuò)誤質(zhì)量碼的時(shí)候,位號(hào)讀取方法會(huì)拋出BadValueException異常,除了質(zhì)量碼跟數(shù)值,位號(hào)值還包括了采集數(shù)據(jù)值的時(shí)間戳,因此把數(shù)值,質(zhì)量碼,時(shí)間戳封裝進(jìn)了一個(gè)TagValue,作為一個(gè)位號(hào)值。位號(hào)組則是以一組位號(hào)為單位的TagGroup實(shí)例,聯(lián)合讀取各位號(hào)的實(shí)時(shí)值或歷史值,以二維表的形式返回,以位號(hào)組中各位號(hào)名為列,支持以列名或者列索引獲取組內(nèi)某位號(hào)的每行數(shù)據(jù)。通過(guò)位號(hào)工廠即可獲取位號(hào)與位號(hào)組對(duì)象,ITagFactory提供如下工廠方法:
名稱(chēng) 功能
getTag(String name) 獲取位號(hào)實(shí)例。
getTagGroup(String[] names) 獲取位號(hào)組實(shí)例。
getTagGroup(String regex) 獲取位號(hào)組實(shí)例。
(一) 讀位號(hào)實(shí)時(shí)值
通過(guò)位號(hào)工廠ITagFactory的getTag(tagNameStr)方法來(lái)獲得實(shí)際的位號(hào)實(shí)例。該方法將根據(jù)位號(hào)的具體屬性,返回虛位號(hào)或?qū)嵨惶?hào)的實(shí)體,而JRtdbc使用者并不需要關(guān)系其細(xì)節(jié)。具體的方法如下:
ITag t = conn.getTagFactory().getTag( tagName ) ;
通過(guò)ITag實(shí)例,可以完成讀取實(shí)時(shí)值的操作。雖然每個(gè)位號(hào)均有其原生的數(shù)據(jù)類(lèi)型,但ESP-iSYS在讀取時(shí)做了安全的類(lèi)型轉(zhuǎn)換,也就是說(shuō),對(duì)于一個(gè)int類(lèi)型的位號(hào),仍然可以采用readFloat或readString方法,來(lái)獲得浮點(diǎn)值或字符串值。ITag接口提供了針對(duì)不同數(shù)據(jù)類(lèi)型的方法,如下:
方法 功能
readBoolean 讀取boolean類(lèi)型的值
readDouble 讀取double類(lèi)型的值
readFloat 讀取float類(lèi)型的值
readInt 讀取int類(lèi)型的值
readLong 讀取long類(lèi)型的值
readShort 讀取short類(lèi)型的值
readString 讀取String類(lèi)型的值
這些方法均會(huì)返回實(shí)時(shí)數(shù)據(jù)庫(kù)中位號(hào)的最新值,通過(guò)TagValue位號(hào)值封裝類(lèi)的getTimeStamp方法,可以獲取到該位號(hào)值對(duì)應(yīng)的時(shí)間戳。典型的使用代碼如下:
ITag t = conn.getTagFactory().getTag( tagName ) ;
TagValue v = t.readValue() ;
Date timeStamp = v.getTimeStamp() ;
SimpleDateFormat sft = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss " );
String timeString = sft.format( timeStamp);
如果兩種數(shù)據(jù)類(lèi)型間不能正確轉(zhuǎn)換時(shí),readXXXX方法將會(huì)拋出TypeCastFailedException異常。
(二) 寫(xiě)位號(hào)實(shí)時(shí)值
寫(xiě)實(shí)時(shí)值的方法和讀取實(shí)時(shí)值是對(duì)應(yīng)的,寫(xiě)位號(hào)同樣可以采用不同的類(lèi)型寫(xiě)入,其列表如下:
方法 功能
writeBoolean 寫(xiě)boolean類(lèi)型的值
writeDouble 寫(xiě)double類(lèi)型的值
writeFloat 寫(xiě)float類(lèi)型的值
writeInt 寫(xiě)int類(lèi)型的值
writeLong 寫(xiě)long類(lèi)型的值
writeShort 寫(xiě)short類(lèi)型的值
writeString 寫(xiě)String類(lèi)型的值
而JRtdbc會(huì)自動(dòng)為該寫(xiě)操作分配時(shí)間戳和打上正確的質(zhì)量碼。
(三) 讀位號(hào)歷史數(shù)據(jù)
通過(guò)ITag實(shí)例,可以完成讀取實(shí)時(shí)數(shù)據(jù)庫(kù)內(nèi)存與磁盤(pán)歷史數(shù)據(jù) ITag接口提供了如下方法:
方法 功能
readAllMemHisValue() 讀取全部?jī)?nèi)存歷史值
readMemHisPointValue(Date p) 讀取某時(shí)刻磁盤(pán)歷史值
readMemHisValue(Date b,Date e) 讀取某個(gè)時(shí)間段的內(nèi)存歷史值
readMemHisValue(Date b,Date e,long i) 采樣讀取某個(gè)時(shí)間段的內(nèi)存歷史值
readDiskHisPointValue(Date p) 讀取某時(shí)刻磁盤(pán)歷史值
readDiskHisValue(Date b,Date e) 讀取某個(gè)時(shí)間段的磁盤(pán)歷史值
readDiskHisValue(Date b,Date e,long i) 采樣讀取某個(gè)時(shí)間段的磁盤(pán)歷史值
readHisValue(Date b,Date e,long i) 自動(dòng)區(qū)分內(nèi)存或磁盤(pán)歷史
采樣,即為以一定的時(shí)間間隔去讀位號(hào)值,如果某時(shí)刻無(wú)值存在,以NULL填充,因此采樣讀歷史數(shù)據(jù),讀出來(lái)的是一個(gè)以相等時(shí)間間隔的值序列。不采樣純粹讀出時(shí)間條件范圍內(nèi)的所有位號(hào)值,典型的讀位號(hào)歷史值的代碼如下:
ITag t = tf.getTag(“TT3502”) ;
//讀取全部?jī)?nèi)存歷史
ArrayList
vs = t.readAllMemHisValue() ;
//讀取時(shí)間段的磁盤(pán)歷史,begin,end 起始與結(jié)束時(shí)間,inter采樣間隔,無(wú)值時(shí)以NULL填充進(jìn)容器。
ArrayList vs = t.readDiskHisValue( begin,end,inter)
(四) 讀取位號(hào)組值
讀 位號(hào)組的接口方法與單個(gè)位號(hào)是一樣的,統(tǒng)一接口,易于使用,首先以一組位號(hào)名為參數(shù),通過(guò)位號(hào)工廠得到位號(hào)組對(duì)象,調(diào)用讀取方法,與單個(gè)位號(hào)不同的只是位號(hào)組返回的是以位號(hào)名為列的二維表TagDataTable形式的結(jié)構(gòu),與Jdbc的Record類(lèi)似,可以遍歷表中的所有行,通過(guò)位號(hào)名或者列索引獲得組內(nèi)某個(gè)位號(hào)的值,因此Java開(kāi)發(fā)人員可以像處理Jdbc的Record一樣處理位號(hào)組返回的數(shù)據(jù),典型的使用代碼如下:
String[] names = {“TT3501”,”TT3502”,”TT3503”}
ITagFactory tf = conn.getTagFactory() ;
ITagGroup tgrp = tf.getTagGroup(names) ;
//讀實(shí)時(shí)值
TagDataRow r = tgrp.readValue() ;
TagValue v = r.getValue(“TT3501”) ;
//讀歷史值
TagDataTable t = tgrp.readDiskHisValue(begin,end,interval);
For(TagDataRow row : t.getRows()){
TagValue v = row.getValue(0);//以索引獲得
System.out.println( v.getTimeStamp() ) ;//打印獲取時(shí)間。
}
通過(guò)JRtdbc操作實(shí)時(shí)數(shù)據(jù)庫(kù)位號(hào)與位號(hào)組是如此的方便與直觀,用戶(hù)完全感覺(jué)不到正在操作的是深?yuàn)W的實(shí)時(shí)數(shù)據(jù)庫(kù)。
用戶(hù)與用戶(hù)組
登錄實(shí)時(shí)數(shù)據(jù)庫(kù)的用戶(hù),以一個(gè)用戶(hù)對(duì)象IUser存儲(chǔ)在實(shí)時(shí)數(shù)據(jù)內(nèi)部,當(dāng)然還有其隸屬的用戶(hù)組IUserGroup,用戶(hù)也可以在權(quán)限范圍內(nèi)增加刪除用戶(hù),為用戶(hù)分配權(quán)限,分配用戶(hù)組,所有操作類(lèi)似于平常操作系統(tǒng)的用戶(hù)用戶(hù)組結(jié)構(gòu),從系統(tǒng)UML圖可以看出,IUser與IUserGroup派生于IUserBase,IUserBase抽取出了公共的對(duì)權(quán)限訪問(wèn)列表操作的方法。通過(guò)IConnection獲得IUserFacotry用戶(hù)工廠,該工廠提供了如下工廠方法:
方法 功能
addUser(UserAttribute attr) 添加用戶(hù)
addUserGroup(UserGroupAttribute attr) 添加用戶(hù)組
delUser( String name ) 刪除用戶(hù)
delUserGroup(String name) 刪除用戶(hù)組
getUsers() 枚舉用戶(hù)
getUserGroups() 枚舉用戶(hù)組
(一) 添加刪除枚舉用戶(hù)/用戶(hù)組
添加用戶(hù)/用戶(hù)組一般操作相當(dāng)簡(jiǎn)單,取得連接后,得到用戶(hù)工廠,建立用戶(hù)或用戶(hù)組屬性對(duì)象,調(diào)用工廠方法addUser與addUserGroup即可,刪除用戶(hù)/用戶(hù)組只須以名稱(chēng)為參數(shù)調(diào)用delUser/delUserGroup方法,典型代碼如下:
IUserFacotry uf = conn.getUserFacotry() ;
//添加用戶(hù)
IUser u = uf.addUser( new UserAttribute(“TESTUSER”)) ;
Boolean b = uf.delUser(“TESTUSER”) ; //刪除用戶(hù)
//添加用戶(hù)組
IUserGroup grp = uf.addUserGroup( new UserGroup(“admin”)) ;
Boolean b = uf.delUserGroup(“admin”);//刪除用戶(hù)組
//枚舉用戶(hù)用戶(hù)組
ArrayList users = uf.getUsers() ;
ArrayList grps = uf.getGroups() ;
(二) 驗(yàn)證用戶(hù)權(quán)限
實(shí)時(shí)數(shù)據(jù)庫(kù)有完整的安全機(jī)制,每個(gè)對(duì)象類(lèi)型都有一系列的權(quán)限項(xiàng)存在,只有在權(quán)限允許的情況下,用戶(hù)才能對(duì)實(shí)時(shí)數(shù)據(jù)庫(kù)中的對(duì)象進(jìn)行操作,IUser接口提供了簡(jiǎn)單的接口來(lái)驗(yàn)證用戶(hù)是否具有操作實(shí)時(shí)數(shù)據(jù)庫(kù)對(duì)象的權(quán)限,比如用戶(hù)是否有權(quán)刪除一個(gè)位號(hào),刪除位號(hào)這個(gè)權(quán)限項(xiàng)被定義在位號(hào)對(duì)象類(lèi)型內(nèi),典型代碼如下:
IUser u = new User(conn,”admin”) ;
String path = “.\水化車(chē)間\TT3502”;//某車(chē)間下的一個(gè)位號(hào)
String right = “刪除位號(hào)” ;
Boolean b = u. authenticate(path,right) ;
If( b ) { ……} else { System.out.println(“用戶(hù)無(wú)權(quán)限刪除該位號(hào)”);}
(三) 用戶(hù)/用戶(hù)組權(quán)限訪問(wèn)列表
用戶(hù)/用戶(hù)組擁有一個(gè)允許訪問(wèn)列表和一個(gè)拒絕訪問(wèn)列表,這二個(gè)列表描述的是在對(duì)象類(lèi)型當(dāng)中定義的權(quán)限項(xiàng)是否具有,JRtdbc使用者可以通過(guò)IUser與IUserGroup提供的接口獲得訪問(wèn)列表ArrayList,ACEHeader類(lèi)封裝了對(duì)象路徑與之對(duì)應(yīng)的權(quán)限名稱(chēng),并支持增加或刪除列表項(xiàng),下面以IUser為例,給出典型代碼:
IUser u = new User(conn,”admin”) ;
String path = “.\水化車(chē)間\TT3502”;//某車(chē)間下的一個(gè)位號(hào)
String right = “刪除位號(hào)” ;
Boolean b = u. removeACE(path,right) ;//刪除了用戶(hù)對(duì)位號(hào)的刪除權(quán)限
IUser u2 = new User(conn,”test”) ;
Boolean b = u2.addACE(path,right) ;//用戶(hù)具有了刪除權(quán)限
//枚舉
ArrayList aces = u.getACList() ;
ArrayList dcls = u.getDCList() ;
對(duì)象類(lèi)型與權(quán)限體系
實(shí)時(shí)數(shù)據(jù)據(jù)庫(kù)當(dāng)中的對(duì)象都有其對(duì)應(yīng)的對(duì)象類(lèi)型,例如,位號(hào)就是一個(gè)對(duì)象樹(shù)上的特殊類(lèi)型。對(duì)象類(lèi)型都派生于IElementType,該接口提供了如添加自定義屬性描述、添加權(quán)限項(xiàng)等功能。類(lèi)型工廠ITypeFactory提供了下列工廠方法:
名稱(chēng)功能
addType(ElementTypeAttribute attr) 添加對(duì)象類(lèi)型
delType(String typename) 刪除對(duì)象類(lèi)型
getTypes() 枚舉對(duì)象類(lèi)型
獲取連接,得到類(lèi)型工廠后,即可添加刪除對(duì)象類(lèi)型,
(一) 添加刪除對(duì)象類(lèi)型
在實(shí)時(shí)數(shù)據(jù)中添加對(duì)象類(lèi)型非常的簡(jiǎn)單,比如在實(shí)時(shí)數(shù)據(jù)庫(kù)當(dāng)中添加一種報(bào)表這樣的一種類(lèi)型,可先獲得類(lèi)型工廠,然后建立新類(lèi)型的屬性對(duì)象TypeAttribute其中只有類(lèi)型名必須指定,調(diào)用addType添加,刪除類(lèi)型只須調(diào)用delType,并以對(duì)象類(lèi)型名稱(chēng)為參數(shù),典型代碼如下:
ITypeFactory typef = conn.getTypeFacotry() ;
TypeAttribute attr = new TypeAttribute(“報(bào)表”) ;
IElementType type = Typef.addType( attr ) ;//添加對(duì)象類(lèi)型。
Boolean b = typef.delType(“報(bào)表”) ;//刪除對(duì)象類(lèi)型
ArrayList types = typef.getTypes() ;//枚舉
(二) 添加自定義屬性描述
在實(shí)時(shí)數(shù)據(jù)庫(kù)當(dāng)中,可以為實(shí)時(shí)數(shù)據(jù)庫(kù)對(duì)象添加自定義屬性,存儲(chǔ)在對(duì)象屬性ElementAttribute的Hashtable中,實(shí)時(shí)數(shù)據(jù)庫(kù)為驗(yàn)證自定義添加的屬性正確性,用戶(hù)必須提供自定義屬性的描述信息,為簡(jiǎn)化操作,JRtdbc把描述信息抽象成TypeBase,具體描述類(lèi)派生于此基類(lèi),提供了自定義屬性的相關(guān)約束條,如最大值,最小值,值類(lèi)型等,目前支持三種自定義類(lèi)型的添加,Int32Type整型,DoubleType浮點(diǎn)型和StringType字符串型。比如現(xiàn)有report1這么一個(gè)報(bào)表對(duì)象,用戶(hù)要為其添加一個(gè)名為path的路徑屬性,值為C:\report,則首先應(yīng)該獲取報(bào)表對(duì)象類(lèi)型對(duì)象,在類(lèi)型對(duì)象當(dāng)中添加這個(gè)自定義屬性的描述信息,如自定義屬性名應(yīng)該為path,類(lèi)型為String,最大長(zhǎng)度為100等信息,這樣才能正確的為具體報(bào)表對(duì)象添加進(jìn)這個(gè)自定義屬性,典型代碼如下:
StringType t = new StringType( path,true,”c:\report”) ;
t.setMaxLength(100);
Boolean b = type.addAttribute( t ) ;
(三) 添加權(quán)限項(xiàng)
實(shí)時(shí)數(shù)據(jù)庫(kù)中每種對(duì)象類(lèi)型都有其權(quán)限項(xiàng)列表,比如報(bào)表這個(gè)對(duì)象類(lèi)型,它有完全控制、讀報(bào)表,寫(xiě)報(bào)表、添加報(bào)表、刪除報(bào)表等權(quán)限項(xiàng),用戶(hù)可以通過(guò)接口對(duì)權(quán)限項(xiàng)進(jìn)行添加或刪除,首先新建一個(gè)權(quán)限屬性對(duì)象,設(shè)置權(quán)限項(xiàng)名稱(chēng)等信息,獲得對(duì)象類(lèi)型對(duì)象,調(diào)用addRight添加即可,刪除操作直接以權(quán)限名為參數(shù),調(diào)用delRight即可,典型代碼如下:
RightAttribute attr = new RightAttribute(“報(bào)表完全控制”) ;
Boolean b = type.addRight( attr ) ;//添加權(quán)限項(xiàng)
Boolean b = type.delRight( rightName ) ;//刪除權(quán)限項(xiàng)
對(duì)象樹(shù)的訪問(wèn)與操作
為簡(jiǎn)化在ESP-iSYS上進(jìn)行Java開(kāi)發(fā),ESP-iSYS內(nèi)部以企業(yè)資源樹(shù)的形式來(lái)組織對(duì)象,位號(hào)、報(bào)表、區(qū)域、流程圖等都是樹(shù)上的對(duì)象,其中區(qū)域里面可以有對(duì)象也可以包含子區(qū)域,就像企業(yè)里面的組織結(jié)構(gòu),比如一個(gè)部門(mén)里有許多對(duì)象,也有許多車(chē)間,車(chē)間里又有位號(hào)之類(lèi)的對(duì)象可能還有二級(jí)車(chē)間,這里部門(mén)和車(chē)間或二級(jí)車(chē)間在實(shí)時(shí)數(shù)據(jù)庫(kù)里就表示為區(qū)域?qū)ο蟆?duì)象樹(shù)上的所有對(duì)象都派生于IElement,使得開(kāi)發(fā)人員可以統(tǒng)一對(duì)待所有對(duì)象,對(duì)象屬性有預(yù)定義屬性和自定義屬性,預(yù)定義屬性以成員變量的形式存于對(duì)象實(shí)例中,自定義屬性存放于Hashtable中,須先以TypeBase在對(duì)象類(lèi)型中添加自定義屬性描述后,才能為對(duì)象正確添加自定義屬性,目前支持浮點(diǎn)型、整型、字符串型三種類(lèi)型,如圖:
可以通過(guò)IConnection方法getRegionRoot()獲取對(duì)象樹(shù)的根區(qū)域節(jié)點(diǎn)IRegion,從而完全遍歷與訪問(wèn)各類(lèi)對(duì)象。
(一) 添加對(duì)象
連接建立后,可通過(guò)IConnection的getRegionRoot方法獲得對(duì)象樹(shù)根結(jié)點(diǎn),遍歷到欲添加對(duì)象的區(qū)域節(jié)點(diǎn),然后以對(duì)象屬性ElementAttribute為參數(shù),對(duì)象屬性封裝類(lèi)已提供了大部份默認(rèn)值,用戶(hù)可只對(duì)必要字段進(jìn)行賦值即可構(gòu)建屬性對(duì)象,避免了對(duì)大串屬性一一賦值的煩瑣,簡(jiǎn)化開(kāi)發(fā),再調(diào)用addElement(ElementAttribute attr)方法添加對(duì)象,相同方法添加位號(hào)或其它對(duì)象,典型代碼如下:
IRegion root = conn.getRegionRoot() ;
RealTagAttribute realTagAttr = new RealTagAttribute(“TT”);
ITag t = root.addTag( realTagAttr ) ;添加位號(hào)
//IElement e = root.addElement(ElementAttribute attr) ;
(二) 添加自定義屬性
遍歷對(duì)象樹(shù)獲取對(duì)象實(shí)例,調(diào)用getElementAttribute方法獲取對(duì)象屬性,調(diào)用addCustAttrbute(name,value)添加自定義屬性,如在對(duì)象類(lèi)型屬性?xún)?nèi)未添加自定義屬性描述,或者與描述信息不符,則拋出InValidAtrributeException,典型代碼如下:
ITagFactory tf = conn.getTagFactory() ;
ITag t = tf.getTag( “TT3502” ) ;
ElementAttribute ta = t.getElementAttribute() ;
Ta.addCustAttr(“CustAttr”,”CustAttrValue”) ;
異常處理模塊
JRtdbc有一套完整的異常體系,所有JRtdbc自有的異常全部派生于RtdbcException,含義明確,對(duì)拋出原因一目了然,并且大部份定義為未檢異常,因?yàn)檫@些異常拋出后,用戶(hù)無(wú)力恢復(fù),未檢異常不用讓用戶(hù)必須Try,Catch,這樣減少代碼量,降低開(kāi)發(fā)復(fù)雜度。具體如下:
名稱(chēng) 含義
RtdbException 實(shí)時(shí)數(shù)據(jù)庫(kù)異常基類(lèi)
BadValueException 位號(hào)值質(zhì)量碼異常,讀到壞值時(shí)拋出
InValidPackageException 包解析錯(cuò)誤時(shí)拋出
InValidAttributeException 添加自定義屬性時(shí),屬性無(wú)效時(shí)拋出
三 實(shí)例展示
下面是一個(gè)使用JRtdbc開(kāi)發(fā)的一個(gè)讀取位號(hào)實(shí)時(shí)值與歷史值的完整示例,緊湊簡(jiǎn)短的幾句Java代碼即可讀取到工業(yè)自動(dòng)化領(lǐng)域當(dāng)中的實(shí)時(shí)信息。
四 總結(jié)
以上詳細(xì)介紹了ESP-iSYS平臺(tái)Java接口的架構(gòu)與使用步驟,“一個(gè)連接,四個(gè)工廠”通過(guò)短短的數(shù)行Java代碼即能揭開(kāi)實(shí)時(shí)數(shù)據(jù)庫(kù)的神秘面紗,讓開(kāi)發(fā)人員暢游整個(gè)實(shí)時(shí)數(shù)據(jù)庫(kù),Java愛(ài)好者們可以盡情享受用Java快速開(kāi)發(fā)實(shí)時(shí)應(yīng)用所帶來(lái)的樂(lè)趣。浙江中控軟件技術(shù)有限公司在今后會(huì)不斷的對(duì)其進(jìn)行維護(hù)和升級(jí),并對(duì)開(kāi)發(fā)者提供良好的技術(shù)支持,共同努力在J2EE平臺(tái)上開(kāi)發(fā)出更多更優(yōu)秀的實(shí)時(shí)應(yīng)用。