所以我正在解決一些問題,一些建議會很好。先有一點背景,請原諒。如何處理具有多個輸入和輸出的單個文本io流?
我正在通過TL1 protocol查詢網絡設備的管理系統。對於那些不熟悉協議的人來說,最簡單的答案就是通過基於文本的IO流進行通信的「人類可讀」語言。
我使用Spring和Jsch打開一個端口到遠程網元(網元),登錄,運行命令,然後關閉連接。有兩種進入遠程網元的方式,直接(通過ssh網關)如果元素有一個tcp/ip地址(許多隻是osi),或者通過某種類型的ems(管理系統)使用所謂的「北向接口」。
無論哪種方式,程序是相同的。
- 使用Jsch打開一個端口到NE或ems。
- 發送網元前的登錄命令
"act-user<tid>:<username>:UniqueId::<password>;"
- 發送命令ex。
"rtrv-alm-all:<tid>:ALL:uniqueid::,,,,;"
檢索並處理結果。上述例如可能是這個樣子的結果...
RTRV-ALM-ALL:foo:ALL:uniqueid;
CMPSW205 02-01-11 18:33:05
M uniqueid COMPLD
"01-01-06:MJ,BOARDOUT-ALM,SA,01-10,12-53-58,,:\"OPA_C__LRX:BOARD EXTRACTED\","
;
;
很重要,因爲它表示響應的結束。
- 最後註銷並關閉端口。
隨着春天我一直在使用ThreadPoolTaskExecutor
相當有效地做到這一點。
直到這個問題上來......
與一個特定的EMS平臺(日立),我碰到一個障礙跑了我的做法。這個EMS通過它可以處理多達80個節點。您連接到端口,然後發出命令登錄到ems,然後運行指向各個NE的命令。與以前相同的過程,但這裏是問題...
在您登錄到ems後,無論是什麼,下一個命令將花費10分鐘完成。直到發生這種情況,所有其他命令都被阻止。在初始等待之後,所有其他命令都可以快速工作似乎沒有辦法打敗這種行爲(我懷疑在此期間有一些NE自動發現發生)。
現在我的問題的重點......
因此,我對這個平臺的下一個方法是連接到ems,登錄到它,並保持連接打開,並將命令傳遞給各個NE。這意味着應用程序(基於Web)第一次加載後延遲10分鐘,但在此之後會很好。
我遇到的問題是如何最好地做到這一點。使用單個基於文本的iostream傳遞這些東西看起來像是一個很大的瓶頸,再加上多個用戶將使用該應用程序,我該如何處理針對這個單一iostream的多個命令和響應?我可以在這個ems上打開幾個iostreams(也許最多6個),但是這也會使得分析哪些地方變得複雜。
任何意見的方向將不勝感激。
回答一些要點。該應用程序在Tomcat下運行,因此只有當我重新啓動Tomcat時纔會注意到延遲。已經有一種TL1命令作爲一種類型 - 「rtrv-hdr」命令的ping命令。 – Bill 2010-07-23 20:27:30
那麼您是否正在尋找如何實際開發處理接受命令的隊列結構,通過套接字發送它們,檢索結果並將它們發送回適當的客戶端? – 2010-07-23 20:30:22