首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Java API 处理 WebSphere MQ 大消息(3)

使用 Java API 处理 WebSphere MQ 大消息(3)

[size=1.0625]程序功能介绍:
  • AppSegSender 程序是使用一个 for 循环,构造一个完整消息的三个消息片段,分别写入队列 TESTQ 中。
  • AppSegReceiver 程序是从队列 TESTQ 中循环读取消息片段,根据其逻辑顺序以及是否是最后一个消息片段来组装完整的消息。
[size=1.0625]相对于队列管理器器自动实现消息分片的方式,应用程序实现消息分片略显复杂,但是它能够处理更大的消息。
消息分组[size=1.0625]从实现手段上来讲,消息分组和消息分片非常类似,但二者有着完全不同的业务意义。在消息分片中,虽然每一个消息片段都作为一个独立的消息进行传输,但只有收集到所有的消息片段组成一个完整的消息之后才有业务意义,单独的一个消息片段是没有任何业务意义的。从这一点上讲,我们是由于技术上处理大消息有困难,才想到把大消息进行切分的。而消息分组则不同,它的每一个成员消息都是一个具有业务意义的独立消息,只是由于某些需要,比如,组内消息有明确的先后顺序,等等,才把这批消息作为一组进行传输。
[size=1.0625]在实际实现中,组内的消息是通过 MQMD 中 GroupId 和 MsgSeqNumber 2个属性来标识,而最后一个消息则会标记这是组内的最后一个消息(MQMF_LAST_MSG_IN_GROUP)。
[size=1.0625]与消息分片类似,一般在发送方程序中,我们是把同一组的所有消息放在一个同步点中发送,所以需要设置 MQPutMessageOptions 为 MQPMO_SYNCPOINT;同时,我们推荐使用选项 MQPMO_LOGICAL_ORDER,这意味着队列管理器自动维护每个消息的序列号(MsgSeqNumber),否则,需要应用程序自身来设置:
[size=1.0625]MQPutMessageOptions pmo = new MQPutMessageOptions ();
[size=1.0625]pmo.options = MQC.MQPMO_LOGICAL_ORDER + MQC.MQPMO_SYNCPOINT;
[size=1.0625]对于每一个消息,我们还应标识这是一个组内的消息(MQMF_MSG_IN_GROUP):
[size=1.0625]myMsg.messageFlags = MQC.MQMF_MSG_IN_GROUP;
[size=1.0625]对于组内的最后一个消息,也需要设置特殊标识(MQMF_LAST_MSG_IN_GROUP):
[size=1.0625]myMsg.messageFlags = MQC.MQMF_LAST_MSG_IN_GROUP;
[size=1.0625]同样的,在接收方程序中,我们也是把同一组的所有消息放在一个同步点中接收,所以需要设置 MQGetMessageOptions 为 MQGMO_SYNCPOINT;同时,我们也设置 MQGMO_LOGICAL_ORDER 来保证同一个组里的所有消息是按逻辑顺序被取出;另外,我们还需设置同一组所有的消息都到达后才处理的选项(MQGMO_ALL_MSGS_AVAILABLE),这是为了防止万一由于异常导致某一成员消息丢失而引起程序无限等待的情形:
[size=1.0625]MQGetMessageOptions gmo = new MQGetMessageOptions ();
[size=1.0625]gmo.options = MQC.MQGMO_LOGICAL_ORDER + MQC.MQGMO_SYNCPOINT + MQC.MQGMO_ALL_MSGS_AVAILABLE;
[size=1.0625]由于我们是按逻辑顺序来取组内成员消息的,所以设置循环取消息的时候,只要遇到某一个消息是组内最后一个的标识,我们就认为已经取到了该组所有的消息。如果没有设置按照逻辑顺序来取消息片段,则需要应用程序根据消息序列号、取到的消息个数、是否是组内最后一个消息等标识来判断是否已经取到该组所有的消息。
[size=1.0625]部分代码如清单 3,您可以下载详[size=1.0625]细的示例代码。
山不在高,有仙则名;水不在深,有龙则灵。
返回列表