錯誤返回碼,造成MCA異常終止。
注意:
每次完整的消息傳輸僅僅調用消息出口一次,即使是消息被分割成幾部分也是如此。
發送/接收出口對每一個消息段(message segment)調用一次,即如果您對消息進行了分段處理,則每一段都將被發送/接收出口處理。消息出口在以下這些情況下被調用:
MCA初始化和終止時;
在發送端數據被發送之前,在接收端數據被接收之前。
2.3.1 發送/接收出口應用場合:
與消息出口類似,發送/接收出口也可以用於數據加密/解密,壓縮/解壓縮,不同的是,它對每一個消息段調用一次,而不僅限於完整的消息,因此,用於消息內部數據結構不是很重要的場合,即把每一段當作一個”blob”來處理。
如上圖所示,各種出口程序的執行順序是:
1)安全出口在通道兩端數據初始化時被調用,它們必須被成功執行以便於使通道啟動階段正常結束,從而允許消息的傳輸。在通道啟動之前利用安全出口,與對方交換一些信息來實現安全認證的工作。
2)消息出口被發送端MCA調用,然後發送出口被調用,從而處理被傳輸的消息。
3) 當接收端收到消息時,調用接收出口,然後調用消息出口。
它們之間的其他區別在於:
對於不同類型的通道,可以設置的通道出口類型不同。
Security Exit必須成對使用,對應的agent buffer只包含有關的安全數據,它不能操作或Access消息體的內容,所以它無法用來對消息進行加密,壓縮處理。
Send/Receive Exit通常情況下成對使用,它對應的agent buffer包含具體的傳輸數據,因此能夠操作消息體的內容;對於send exit,agent buffer的前8個位元組為保留字,專為MCA所用。
MsgExit可以不必成對使用,它對應的agent buffer包含MQ的傳輸頭以及具體的消息體,它也能夠操作消息體的內容。
下表總結了各種類型的通道支持的出口類型以及對應的agent buffer的內容:
|
Exit |
Channel Type |
Buffer data MQXCP+ |
|||||
|
Sdr |
Svr |
Rcvr |
Requr |
CLNTCONN |
SVRCONN |
||
|
Security |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Security msg |
|
Message |
Yes |
Yes |
Yes |
Yes |
MQXQH+msg |
||
|
Send |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
8bytes+data |
|
Receive |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
8bytes+data |
其中,MQXCP代表通道出口程序數據結構;
MQXQH代表傳輸隊列頭

各類出口程序在各種平台上的編寫結構基本都是一樣的。下面以NT/2000平台上的消息出口程序編寫為例說明之。
對消息出口,緩衝區應允許最大消息和MQXQH結構大小之和;
對安全出口,緩衝區可以分配一個4000位元組;
對發送/接收出口,緩衝區不能大於:
|
TCP: AS/400:16KB Others:32KB UDP: 32KB NetBIOS: DOS:4 KB Others:64 KB LU 6.2: OS/2:64 KB Others:32 KB
|
在Windows NT/2000平台中,由MMC(微軟管理控制器)控制服務管理接口進行管理,以確保該動態鏈接庫在需要時被調用。
定義出口程序的路徑的方法有:
用戶可以在定義通道(DEFINE CHANNEL)時指定帶有全路徑的文件名;
通過MQ Services圖形界面更改隊列管理的ExitPath屬性指定出口路徑名。
下面實例中,以MQ安裝時設定的目錄c:\mqm\exits作為出口程序的存放目錄,並在定義通道的消息出口屬性時定義全路徑。
本文附件將提供一個消息出口程序,其作用是將消息數據進行簡單的加密處理,由於它是對原數據的每一個位元組取反,因此它同時也可以位於通道的另一端對消息進行解密處理。該程序名為msgexit.c。
以msgexit.c為例,消息出口程序的基本框架大致如下:
|
#include <cmqc.h> #include <cmqxc.h>
void MQStart() {;} /*dummy entry point – for consistency only */ void MQENTRY MsgExit ( PMQCXP pChannelExitParms, PMQCD pChannelDefinition, PMQLONG pDataLength, PMQLONG pAgentBufferLength, PMQVOID pAgentBuffer, PMQLONG pExitBufferLength, PMQPTR pExitBufferAddr) { /* 變量定義 */ PMQCXP pParms; PMQCD pChDef; pParms = (PMQCXP)pChannelExitParms; pChDef = (PMQCD)pChannelDefinition; … 在此加入用戶代碼 }
|
為了能夠訪問pChannelExitParms和pChannelDefinition兩個指針,用戶必須在出口程序中加入開始的這幾行內容,通過pParms 和 pChDef進行訪問。樣板程序中沒有訪問此兩個指針,故沒有定義這幾行。
使用Visual C++編譯程序,需要作以下幾步操作:
1)將MQMVX.LIB作為源文件加入項目文件中;
2)將C/C++項目設置中的”Use Run-Time Library”從”Multithreaded”改變到”Multithreaded using DLL”,
3)不要改變C/C++項目Link設置中的”Entry-Point Symbol”。
|
LIBRARY MSGEXIT PROTMODE DESCRIPTION ‘Provides Channel Message exits’ CODE SHARED LOADONCALL DATA MULTIPLE HEAPSIZE 4096 STACKSIZE 8192 EXPORTS MsgExit |
以下文章點擊率最高
Loading…