编写和编译发布出口

您可以在队列管理器上配置发布出口,以便在订户接收发布的消息之前更改该消息的内容。 另外,您还可以更改消息头或者不将该消息传递到预订。

注: 发布出口在 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。 它根据是否调用出口来初始化、发布或终止操作,向日志文件写入不同的消息。 它还展示了如何使用出口用户区域字段来适当地分配和释放存储器。