WebsphereMQ设计篇第十九章消息上下文(MessageContext).docx_第1页
WebsphereMQ设计篇第十九章消息上下文(MessageContext).docx_第2页
WebsphereMQ设计篇第十九章消息上下文(MessageContext).docx_第3页
WebsphereMQ设计篇第十九章消息上下文(MessageContext).docx_第4页
WebsphereMQ设计篇第十九章消息上下文(MessageContext).docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Websphere MQ设计篇 第十九章 消息上下文 (Message Context)第十九章 消息上下文 (Message Context) 一般说来,任意两条消息之间的属性是独立无关的,每条消息都有各自的属性。比如,在缺省情况下,队列中的一条消息被 MQGET 取出来,然后又原封不动地 MQPUT 放回去。虽然在内容上没有任何地改动,然而在一进一出之后,就变成了两条消息。严格地说,放回去的消息已经不是原先在队列中的那条消息了,它们可以有各自的属性,从后一条消息中是看不出前一条消息的痕迹的。 MQPUT 这么一个环节之后就“脱胎换骨”成 缺省情况下,消息在经历了 MQGET 和了另一条消息,下一个环节只能知道消息的来源是上一个环节,而无法知道消息是由上一个环节产生,还是由上一个环节转发,更无法知道上一个环节之前的发送者。(如图) 这样消息链中的每一个环节只能对上一环节对安全检查和权限认证,从而决定是否让消息通过,缺乏能在消息链全程中发挥作用的安全机制。消息链的末端也只能看见最后一个环节,根本无法知晓消息的始作俑者,从而给末端授权或末端计费的应用带来一定的困难。 abc abc abc abc 1 2 3 4 图 有时候,在实际的应用场景中需要消息的某些属性能够经历多次传递而不变。这就意味着某些消息属性能够跨越一个环节,被自动复制到新的相关消息中去,从而被一环一环地传递下去,直到消息链的终点。(如图) 终点的接收程序可以通过这些属性知道消息链起始端的发送程序想要传递的某些信息,这些可以被自动地复制传递而贯串始终的消息属性就是所谓的消息上下文 (Message Text)。 abc abc A A 图 消息上下文指的是消息描述符 (MQMD) 中的 8 个字段,分两类:身份上下文 (Identity Context) 和 起源上下文 (Origin Context)。其中身份上下文指的是 MQPUT 或 MQPUT1 时发送程序的用户信息,通常存放消息链中最初的发送程序的用户信息;起源上下文指的是 MQPUT 或 MQPUT1 时发送程序自身的信息,通常存放上一个环节中 MQPUT 程序的信息。可见,如果传递身份上下文,则可以传递用户信息,如果传递起源上下文,则可以传递程序信息。 消息上下文的内容 事实上,WebSphere MQ 允许两种方式传递上下文:一种方式是只传递身份上下文,另一种方式是传递全部上下文,包括身份上下文和起源上下文。(见下表) Identity Context UserIdentifier MQPUT程序的用户名。根据平台环境的不同而有不同的解释。 AccountingToken 应用程序标识或数字。通常用来对最初的发送程序计费。对于,Windows 平台,存放的是用户的 SID (Security Identifier), 这可以作为 UserIdentifier 的一个补充。 ApplIdentityData 可以用来传递辅助的用户信息,比如加了密的口令等等。 Origin Context PutApplType 应用程序的类型,例: CICS 交易 PutApplName 应用程序的名字,例: 交易名或作业名 PutDate 消息生成日期,GMT 格林威治时间 PutTime 消息生成时间,GMT 格林威治时间 ApplOriginData 起源消息数据 表 由于消息上下文具有贯串消息链的功能,所以通常用来: , 对消息源的发送者进行权限检查 , 对消息源的发送者进行服务计费 , 对消息链全程记录 消息上下文的编程 要设置消息上下文是需要有相应的权限的。在使用时,如果应用程序是消息源,则应该设置 (SET) 身份上下文和起源上下文。如果应用程序是中间环节,未改变消息内容,则应该传递 (PASS) 身份上下文,也可以传递起源上下文。如果应用程序是中间环节,且改变了消息内容,则应该设置新的起源上下文。当然,这只是对编程的指导意见,编程本身并不限制对各种上下文域的设置和传递,你甚至可以用拷贝上下文内容的办法来设置上下文,效果看上去就像是传递上下文一样。应用程序对消息上下文的操作是通过 MQPUT 或 MQPUT1 中的 Options 域来完成的。如果不设置此域,则队列管理器会自动设置所有的消息上下文,如同使用 MQPMO_NO_CONTEXT。 在编程时可以用 MQPMO.Options 来设置或传递相应的上下文: , MQPMO_SET_ IDENTITY_CONTEXT , MQPMO_SET_ALL_CONTEXT , MQPMO_PASS_IDENTITY_CONTEXT , MQPMO_PASS_ALL_CONTEXT 如果不设定合适的 Options,则相应的上下文域由队列管理器自动设置。这时,这些域对于 MQPUT 或 MQPUT1 来说,就只是输出域。 设置身份上下文 (Set Identity Context) , 当 MQOPEN 队列打算写消息的时候,用 MQOO_SET_IDENTITY_CONTEXT 选项 MQPUT 时,MQPMO.Options 中设置 MQPMO_SET_IDENTITY_CONTEXT , 当, 根据需要,设置 MQMD 中的 UserIdentifier, AccountingToken, ApplIdentityData 域 设置所有上下文 (Set All Context) , 当 MQOPEN 队列打算写消息的时候,用 MQOO_SET_ALL_CONTEXT 选项 , 当 MQPUT 时,MQPMO.Options 中设置 MQPMO_SET_ALL_CONTEXT UserIdentifier, AccountingToken, ApplIdentityData 域, 根据需要,设置MQMD 中的以及 PutApplType, PutApplName, PutDate, PutTime, ApplOriginData 域 传递身份上下文 (Pass Identity Context) , 在 MQOPEN 队列打算读消息的时候,用 MQOO_SAVE_ALL_CONTEXT 选项,以后读到的消息会保存它的 Context (注意,对浏览程序,不可以用这一选项,也就是说,MQOO_SAVE_ALL_CONTEXT 和 MQOO_BROWSE 不能共用) , 当 MQOPEN 队列打算写消息的时候,用 MQOO_PASS_IDENTITY_CONTEXT 选项 , 当 MQPUT 时,在 MQMD.Context 中设置读队列的句柄 (保存了上下文的那一个队列),MQPMO.Options 中设置 MQPMO_PASS_IDENTITY_CONTEXT 传递所有上下文 (Pass All Context) , 在 MQOPEN 队列打算读消息的时候,用 MQOO_SAVE_ALL_CONTEXT 选项,以后读到的消息会保存它的 Context (注意,对浏览程序,不可以用这一选项,也就是说,MQOO_SAVE_ALL_CONTEXT 和 MQOO_BROWSE 不能共用) , 当 MQOPEN 队列打算写消息的时候,用 MQOO_PASS_ALL_CONTEXT 选项 , 当 MQPUT 时,在 MQMD.Context 中设置读队列的句柄 (保存了上下文的那一个队列),MQPMO.Options 中设置 MQPMO_PASS_ALL_CONTEXT 例程 具体程序参见 MQGetContext.c,MQSetContext.c,MQPassContext.c。这里是 MQPassContext.c 的程序摘要。 mqlOption = MQOO_INPUT_SHARED + MQOO_FAIL_IF_QUIESCING + MQOO_SAVE_ALL_CONTEXT; MQOPEN (mqhConn, / Connection Handle & mqod, / Object Descriptor for Q mqlOption, / MQOPEN Options & mqhReq, / Request Handle & mqlCompletionCode, / Completion Code & mqlReasonCode); / Reason Code strcpy (mqod.ObjectName, szQRepName); mqlOption = MQOO_OUTPUT + MQOO_FAIL_IF_QUIESCING; if (mqlContextType = IDENTITY_CONTEXT) mqlOption += MQOO_PASS_IDENTITY_CONTEXT; else mqlOption += MQOO_PASS_ALL_CONTEXT; MQOPEN (mqhConn, / Connection Handle & mqod, / Object Descriptor for Q mqlOption, / MQOPEN Options & mqhRep, / Reply Handle & mqlCompletionCode, / Completion Code & mqlReasonCode); / Reason Code mqgmo.Version = MQGMO_VERSION_2; mqgmo.MatchOptions = MQMO_NONE; mqgmo.Options = MQGMO_WAIT + MQGMO_CONVERT + MQGMO_ACCEPT_TRUNCATED_MSG; mqgmo.WaitInterval = 2000; / milli-seconds memcpy (mqmd.MsgId, MQMI_NONE, sizeof (mqmd.MsgId); memcpy (mqmd.CorrelId, MQCI_NONE, sizeof (mqmd.CorrelId); mqmd.Encoding = MQENC_NATIVE; mqmd.CodedCharSetId = MQCCSI_Q_MGR; mqlBufferLength = sizeof (mqbMessageBuffer) - 1; MQGET (mqhConn, / Connection Handle mqhReq, / Object Handle & mqmd, / Message Descriptor & mqgmo, / Get Message Options mqlBufferLength, / Buffer Length mqbMessageBuffer, / Message Buffer & mqlMessageLength, / Message Length & mqlCompletionCode, / Completion Code & mqlReasonCode); / Reason Code mqbMessageBuffer mqlMessageLength = 0; printf (Message %d: %sn, i, mqbMessageBuffer); if (mqlContextType = IDENTITY_CONTEXT) mqpmo.Options += MQPMO_PASS_IDENTITY_CONTEXT; else mqpmo.Options += MQPMO_PASS_ALL_CONTEXT; mqpmo.Context = mqhReq; MQPUT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论