编写和编译发布出口
您可以在队列管理器上配置发布出口,以便在订户接收发布的消息之前更改该消息的内容。 另外,您还可以更改消息头或者不将该消息传递到预订。
注: 发布出口在 z/OS®上不受支持。
您可以使用发布出口来检查和更改发送给订户的消息:
- 对发布到每个订户的消息内容进行检查
- 对发布到每个订户的消息内容进行修改
- 更改要将消息放入的队列
- 停止向订户传送消息
编写发布出口
使用 在 AIX, Linux和 Windows 上编写出口和可安装服务中的步骤来帮助您编写和编译出口。
发布出口的提供者定义了出口的作用。 但是,出口必须符合 MQPSXP中定义的规则。
IBM MQ 未提供 MQ_PUBLISH_EXIT 入口点的实现。 它提供了 C 语言 typedef 声明。 使用 typedef 向用户编写的出口正确声明参数。 以下示例演示如何使用 typedef 声明:
#include "cmqec.h"
MQ_PUBLISH_EXIT MyPublishExit;
void MQENTRY MyPublishExit( PMQPSXP pExitParms,
PMQPBC pPubContext,
PMQSBC pSubContext )
{
/* C language statements to perform the function of the exit */
}
发布出口作为下列操作的结果在队列管理器进程中运行:
- 用于将消息传递到一个或多个订户的“发布”操作。
- 用于传递一条或多条已保留的消息的“预订”操作
- 用于传递一条或多条已保留的消息的“预订请求”操作
如果为连接调用发布出口,那么首次调用该出口时将设置 ExitReason 代码 MQXR_INIT 。 在使用发布出口后断开连接之前,将使用 ExitReason 代码 MQXR_TERM调用该出口。
如果已配置发布出口,但无法在启动队列管理器时装入该出口,那么该队列管理器将禁止执行发布/预订消息操作。 您必须先解决问题或重新启动队列管理器,然后才能重新启用发布/预订消息传递。
需要发布出口的每个 IBM MQ 连接都可能无法装入或初始化该出口。 如果此出口无法装入或初始化,那么会对该连接禁用需要发布出口的发布/预订操作。 操作失败,返回 IBM MQ 原因码 MQRC_PUBLISH_EXIT_ERROR。
从中调用发布出口的上下文是应用程序与队列管理器之间的连接。 队列管理器为正在执行发布操作的每个连接维护用户数据区域。 此出口可以在每个连接的用户数据区域保留信息。
发布出口可以使用一些 MQI 调用。 它只能使用处理消息属性的那些 MQI 调用。 调用如下:
- MQBUFMH
- MQCRTMH
- MQDLTMH
- MQDLTMP
- MQMHBUF
- MQINQMP
- MQSETMP
如果发布出口更改了目标队列管理器或队列名,那么不会执行新的权限检查。
编译发布出口
发布出口是动态装入的库;您可以将其想像成通道出口。 有关编译出口的信息,请参阅 在 AIX, Linux和 Windows 上编写出口和可安装服务。
样本发布出口
样本出口程序称为 amqspse0.c。 它根据是否调用出口来初始化、发布或终止操作,向日志文件写入不同的消息。 它还展示了如何使用出口用户区域字段来适当地分配和释放存储器。