當前位置:
首頁 > 最新 > 程序間的數據傳遞方法

程序間的數據傳遞方法

如果把每個程序比喻成一個工人的話,那麼他們需要溝通配合來完成某項工作。同樣,程序之間也需要溝通配合,來實現一定的邏輯。在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立場、策略和觀點無關。文中專業名詞因翻譯原因,表述中難免存在差異。如有疑惑,請以英文為準。同時數據來源於實驗室環境,僅供參考。如果您對我們的話題感興趣,請給我們留言。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 三言兩語CICS 的精彩文章:

TAG:三言兩語CICS |