电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

消息处理机制及扩展.docx

消息处理机制及扩展.docx_第1页
1/6
消息处理机制及扩展.docx_第2页
2/6
消息处理机制及扩展.docx_第3页
3/6
消息队列消息发送消息处理器操作类型④内部公开请勿外传消息处理原理及扩展1.消息处理原理依托于消息队列,当消息发送到消息队列后,根据消息中的“操作类型”来匹配对应的消息处理器,并由该消息处理器执行该消息,此处只涉及消息处理器的扩展。标准产品内置的消息处理器如下:1/6④内部公开请勿外传在消息处理器定义中,同一种操作类型只允许定义一个处理器,但可以挂上多个插件。其中“操作类型”指消息队列表(t_sfc_messagequeue)中的字段FOperationType,对于同一组别的消息,操作类型取自“待执行”状态的那一条消息。如生成不良类的消息,其同一组别的消息中,存在“组装扫描”和“生成不良”两种操作类型,此时取后者。对于组装扫描、批量扫描、包装扫描等同属于生成工序汇报的扫描操作,虽然其最终都生成工序汇报单,但有细微差异,因此仍然把它们区分成不同的操作类型,以便有针对性地处理。在此也建议将处理器粒度尽量最小化,通用的处理则可以放到超类中。下图是组装扫描消息处理器的定义:1.1.消息处理器机制每条消息的执行入口为“处理器实现类”,还可以自定义多个“插件”,其中处理器与插件间可传递当前处理的消息对象(MsgHandlerParam),还可以通过“参数类”来自定义其他可传递的参数。所有处理器实现类的超类为AbstractMsgExecutor,所有插件实现类的超类为AbstractMsgPlugIn,所有参数类都由MsgExecutorParamAttribute以[MsgExecutorParam]属性的形式注册到实现类中,以便参数在处理器和插件间传递。以标准产品中的扫描类消息处理器ExecuteByCacheInfoExecutor和更新工序汇报子单据体字段的插件示例OptRptMsgPlugIn为例,类图如下:2/6④内部公开请勿外传执行顺序图如下:3/6④内部公开请勿外传可以在消息的执行前、执行后通过处理器实现类进行扩展,也可以在事件处理前、事件处理后通过插件实现类进行扩展。2.二开扩展2.1.自定义插件在现有业务的基础上,定义插件,配合已有的消息和消息处理器使用。例如:在组装扫描界面增加录入字段“操作员”返回到汇报单分录中,通过消息队列写入到单据中。1)消息发送格式在向消息队列发送消息时,需要往T_SFC_MessageQueue表中写入字段FExtendJSONData,格式如{"EmpinfoId_Id":120798},其中EmpinfoId_Id为工序汇报子单据体中操作工的属性名,120798为要写入的值。2)实现插件,插件代码如下:4/6④内部公开请勿外传5/6usingKingdee.BOS;usingKingdee.BOS.App;usingKingdee.BOS.Contracts;usingKingdee.BOS.Core.Metadata;usingKingdee.BOS.JSON;usingKingdee.BOS.Orm.DataEntity;usingKingdee.BOS.Orm.Metadata.DataEntity;usingKingdee.BOS.Util;usingKingdee.K3.Core.MFG;usingKingdee.K3.Core.MFG.BizException;usingKingdee.K3.MFG.SFC.App.Core.SFSMessageHandle.ScheduleService.Executor.ParamValue;usingKingdee.K3.MFG.SFC.App.Core.SFSMessageHandle.ScheduleService.Executor.PlugIn;usingSystem;usingSystem.Linq;namespacePlugIn.K3.MFG.SFS.App.Core.ExecutorPlugIns{publicclassOptRptMsgPlugIn:AbstractMsgPlugIn{[MsgExecutorParam]publicExecuteByCacheInfoParamMsgParam{get;set;}publicoverridevoidBeforeExecute(Kingdee.K3.MFG.SFC.App.Core.SFSMessageHandle.ScheduleService.Executor.PlugIn.Args.BeforeExecuteEventArgse){base.BeforeExecute(e);if(this.MsgParam.GenOptRptObj==null)return;//赋值工序汇报子单据体字段UpdateSubEntryExtendValue(e.Context);}privatevoidUpdateSubEntryExtendValue(Contextctx){try{FormMetadatametadata=ServiceHelper.GetService().Load(ctx,"SFC_OperationReport")asFormMetadata;DynamicObjectTypeedt=metadata.BusinessInfo.GetEntity("FSubEntity").DynamicObjectType;DynamicObjectCollectionrptEntries=(this.MsgParam.GenOptRptObj["OptRptEntry"]asDynamicObjectCollection);foreach(varrptEntryinrptEntries){//按跟踪号匹配汇报任务varrptInfos=this.MsgParam.LstRptValueInfo.Where(o=>o.TrackNumber==Convert.ToString(rptEntry["PrdTrackNo"]));if(rptInfos.IsEmpty())continue;stringextendValues=rptInfos.FirstOrDefault().ExtendVaues;if(extendValues.IsNullOrEmptyOrWhiteSpace())continue;//按唯一标识更新JSONObjectextendObj=KDObjectConverter.DeserializeObject(extendValues);DynamicObjectCollectionsubEntries=rptEntry["OptRptDetail"]asDynamicObjectCollection;if(subEntries.Count<1){DynamicObjectsubEntry=edt.CreateInstance()asDynamicObject;subEntries.Add(subEntry);}foreach(varrptDetailinsubEntries){foreach(varpairinextendObj){④内部公开请勿外传3)注册插件在“消息处理器定义”中,针对组装类消息处理器ASScanning,增加插件实现类:2.2.自定义处理器定义一个全新的处理器,处理独立的个性化业务,与“消息发送”模块配合使用,单独处理某一类型的消息。例如,用户自定义了单据A,并在扫描时发送了消息到消息队列,希望通过消息处理器来生成该单据。1)约定“操作类型”,以便在发消息时、注册处理器时使用,注意与已有的操作类型区分开;2)实现处理器,扩展AbstractMsgExecutor,可参考ExecuteByCacheInfoExecutor;3)注册处理器。6/6

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

消息处理机制及扩展.docx

确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信