错误返回码,造成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…