WebSphere MQ出口程序編寫和配置2

    錯誤返回碼,造成MCA異常終止。

注意:

每次完整的消息傳輸僅僅調用消息出口一次,即使是消息被分割成幾部分也是如此。

2.3 發送/接收出口的工作機制

發送/接收出口對每一個消息段(message segment)調用一次,即如果您對消息進行了分段處理,則每一段都將被發送/接收出口處理。消息出口在以下這些情況下被調用:

    MCA初始化和終止時;

    在發送端數據被發送之前,在接收端數據被接收之前。

2.3.1 發送/接收出口應用場合:

    與消息出口類似,發送/接收出口也可以用於數據加密/解密,壓縮/解壓縮,不同的是,它對每一個消息段調用一次,而不僅限於完整的消息,因此,用於消息內部數據結構不是很重要的場合,即把每一段當作一個”blob”來處理。

2.4 出口程序調用順序

如上圖所示,各種出口程序的執行順序是:

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代表傳輸隊列頭


3 出口程序的編寫

各類出口程序在各種平台上的編寫結構基本都是一樣的。下面以NT/2000平台上的消息出口程序編寫為例說明之。

3.1 出口程序中緩衝區的大小:

    對消息出口,緩衝區應允許最大消息和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

 


 

    

    

3.2 出口程序是動態鏈接庫(NT/2000平台)

在Windows NT/2000平台中,由MMC(微軟管理控制器)控制服務管理介面進行管理,以確保該動態鏈接庫在需要時被調用。

定義出口程序的路徑的方法有:

    用戶可以在定義通道(DEFINE CHANNEL)時指定帶有全路徑的文件名;

    通過MQ Services圖形界面更改隊列管理的ExitPath屬性指定出口路徑名。

下面實例中,以MQ安裝時設定的目錄c:\mqm\exits作為出口程序的存放目錄,並在定義通道的消息出口屬性時定義全路徑。

3.3 消息出口程序編寫說明:

本文附件將提供一個消息出口程序,其作用是將消息數據進行簡單的加密處理,由於它是對原數據的每一個位元組取反,因此它同時也可以位於通道的另一端對消息進行解密處理。該程序名為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”。

3.4 DEF樣板文件(msgexit.def):

LIBRARY MSGEXIT

PROTMODE

DESCRIPTION ‘Provides Channel Message exits’

CODE SHARED LOADONCALL

DATA MULTIPLE

HEAPSIZE 4096

STACKSIZE 8192

EXPORTS MsgExit

4 出口程序配置步驟

以下文章點擊率最高

Loading…

     

如果這文章對你有幫助,請掃左上角微信支付-支付寶,給於打賞,以助博客運營