程序間的數據傳遞方法
如果把每個程序比喻成一個工人的話,那麼他們需要溝通配合來完成某項工作。同樣,程序之間也需要溝通配合,來實現一定的邏輯。在CICS 中,程序間在溝通時可以通過兩種方法進行數據傳遞:communication area (COMMAREA)或channel。
如下圖所示,COMMAREA或channel在應用程序之間起到了溝通橋樑的作用。
01
什麼是COMMAREA
我們可以理解為程序在需要進行數據傳遞時在內存中划出一定空間,來臨時存放一些溝通數據。當這塊存儲被創建時,數據在存儲中可以是空、半空或全部填充的狀態,這主要取決於程序如何使用COMMAREA。
COMMAREA是一種常用的技術手段,在發送數據和接收數據時可共享這塊存儲,因此,程序設計者必須提前規劃好數據的最大長度,以確保程序間數據傳遞的可用性和完整性,而COMMAREA在使用時有最大長度的限制,不能超過32KB。
COMMAREA的存在已經有30多年了,隨著計算機世界的不斷發展,COMMAREA 逐漸無法滿足當今應用的很多需求,比如XML messages或者大量數據轉換的問題。那麼CICS是如何解決這類問題的呢?答案是channel和container。
02
什麼是channel和container
在計算機領域中,container是指用來存儲和組織其他對象的對象,在雲平台上,要快速部署並運行一套應用,就是通過container來實現的;簡單來講,就是打包了操作系統鏡像以及應用程序並載入到內存中去運行。
在CICS中,container的概念跟COMMAREA類似,都是用來臨時存放共享數據的內存空間。而 channel 就是多個 container 組合在一起的組名,在程序間進行數據傳遞時,通過 channel 來進行傳遞。
相對於COMMAREA來說,container的優點有:
沒有大小的限制;
可以使用64位存儲;
Channel里可以有一個或多個container,沒有數量限制;
數據轉換是在container之間進行的;
Container可以解決複雜的message結構問題。
channel/container示意圖
03
如何利用channel和container
從CICS Transaction Server 3.1開始, CICS 就支持COMMAREA和 channel/container的使用了,但channel和COMMAREA兩者不能同時使用。從存儲的角度來說,CICS Transaction Server 3.2及以後版本的container使用64位存儲,雖然說單個container的大小不受任何限制,只取決於CICS地址空間中可用的user storage大小,但從使用經驗上來講,最好對container大小的使用進行一些限制,這會提高對存儲使用的可控性,當程序結束時,container和存儲都會自動釋放掉。
對於使用COMMAREA的程序來說,可能切換到channel最簡單的方法是直接用一個包含單個container的channel來替換COMMAREA,但是這並未發揮出channel和 container的優勢,況且仍然需要花時間修改程序進行。因此,程序開發人員在使用channel和container時應該考慮如何更有效地利用它們的優勢。
那麼如何才能更好的使用channel和container?可以從以下幾個方面考慮:
輸入和輸出的container要單獨使用,不要混用。這能簡化copybook的結構,使程序更加易讀。在Distributed Program Link (DPL)中使用channel會減少CICS region之間的數據傳輸量;當DPL完成後,只有container中修改過的數據才會被返回到原CICS region中。
對於只讀和讀寫的數據分開使用container,這能在一定程度上改善CICS region之間的數據傳輸效率。
用一個單獨的、固定的container來專門傳遞錯誤信息。這樣的好處是錯誤信息的文檔能夠更加清晰明了,同時也提高了CICS region之間的數據傳輸效率。當檢查判斷是否有錯時,使用GET CONTAINER命令接收NOTFOUND等condition時更有效,如果不單獨使用,或者說跟其他內容混用的話,判斷錯誤信息時就需要瀏覽container中所有的內容。
在copybook中,對於每個結構都單獨使用container。在定義copybook名以及數據結構的變數名時,可以考慮使用相應的channel名和container名,這樣就避免了有時copybook會混用輸入輸出的變數,減少使用redefine(有時為了節省內存,經常將兩個變數或兩組變數定義成使用一塊內存),避免發生不必要的錯誤。
如果要傳輸不同的數據類型,就分別定義單獨的container。比如,單獨定義傳輸binary類型的數據,單獨定義傳輸char類型的數據等等,這能讓轉換字符集更加簡單方便。
04
樣例
以下為Java程序和COBOL程序之間通過channel/container進行數據傳遞的例子:
Java program
Cobol program
另外,channel或container的名字長度範圍為1-16位,如或EXEC CICS GET CONTAINER(『TTTTTTTTTTTTTTTT』)即16個T,都是可以的。但是,當名字用變數代替時,比如EXEC CICS GET CONTAINER(CONTNAME),變數即CONTNAME的值必須是16個字元,否則會報EIBRESP = 110, EIBRESP2 = 18的錯誤,在使用時應加以注意。
內容聲明:本文僅代表作者的個人觀點,與IBM立場、策略和觀點無關。文中專業名詞因翻譯原因,表述中難免存在差異。如有疑惑,請以英文為準。同時數據來源於實驗室環境,僅供參考。如果您對我們的話題感興趣,請給我們留言。
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
TAG:三言兩語CICS |