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…

     

如果这文章对你有帮助,请扫左上角微信支付-支付宝,给于打赏,以助博客运营

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注