MQ网关优化操作手册下面以网银清算为例,来说明怎么使用AE来定制MQ网关。1.AE配置说明1.1定制网关在“基本定制”-“网关”中右键“新建”,如下图所示,输入网关号和网关名称,选择网关类型,点击确定,完成了网关的基本定制。1.2动态改变日志级别设置选择“渠道”,选中需要设置级别的渠道,如625渠道,然后选择“外部交易请求”,如下图所示:点右键“新建”外部交易码为“0000000000”的外部交易,并设置日志级别,如下图:这样,使用pbsettranlog工具就可以动态改变MQ网关的日志级别。1.3处理函数定制依次选择“基本定制”、“处理函数”、“网关相关”,定制需要的函数,图解如下:1.4新建MQ渠道双击“渠道”,在右面的空白处右键“新建”,来新建MQ渠道。如下图,输入渠道名称和渠道号,点“下一步”。选择渠道类别为“服务渠道(综合渠道)/S”,网关号选择在“网关定制”中定制的网关,选中渠道状态“正常”。输入队列管理器名称、发送队列名、接收队列名、消息生存期、渠道超时时间、等待接收时间、网关进程数、缓冲区大小等项。注:1)其中消息生存期单位是1/10秒,如果设置成-1,就代表消息永久存在;2)接收超时时间单位是毫秒;3)消息缓冲区大小单位是KB;4)通讯模式,如果设置成“MQ事务模式/5”,那么会使用事务方式接收MQ队列的消息。如网银清算,使用的通讯模式是4,不是事务模式;SWIFT使用的是模式5,事务模式。函数的配置如下如果通讯模式是MQ事务模式,需要在函数配置中配置“取报文长度函数”。2.接口函数说明2.1报文接收后处理函数在从MQ中收到消息后进行处理(如可以进行安全认证),AE中定义该函数。在渠道配置的接收后处理函数中选择配置的函数(函数名自己定义,视应用需要开发)。函数原型:intmqrecvfunc(char*buf,intmesslen,CHNL_DEF*chnlP,char*rtnbuf)参数:buf:mq消息messlen:消息长度chnlP:渠道信息rtnbuf:函数处理后返回的数据区。返回值0成功0(-1000转存成文件)其他值:失败0返回的数据区大小2.2获取交易类型函数(请求还是应答交易,该函数接口必须开发)AE中定义该函数。在渠道配置的取交易类型函数中选择配置的函数(函数名自己定义,注意加头文件#includecmqc.h)。函数原型:intGetMsgType(char*buf,CHNL_DEF*chnlP,MQMDmd)参数:buf:经报文接收后处理函数处理完返回的数据chnlP:渠道信息md:消息描述结构体。返回值:REQUEST(宏)请求ANSWER(宏)应答0失败2.3获取外部交易码函数(该函数接口必须开发)AE中定义该函数。在渠道配置的取交易码函数中选择配置的函数(函数名自己定义)。函数原型:intgettrancode(char*buf,CHNL_DEF*chnlP,char*trancode)参数:buf:经报文接收后处理函数处理完返回的数据chnlP:渠道信息trancode:函数处理后返回的交易码。返回值:0成功0失败2.4取渠道跟踪码函数(该函数接口必须开发)AE中定义该函数,在渠道配置的取交易码函数中选择配置的函数。intChnl_IBPSGetTraceCode(CHNL_DEF*ChnlP,char*rcv_buf,long*TraceCode)入参:buf经报文接收后处理函数处理完返回的数据chnlP渠道信息出参:TraceCode:渠道跟踪码。返回值:0成功0失败2.5报文发送前处理函数(该函数接口视需要开发)在发往MQ网关前应用做消息处理(如可以进行安全认证),AE中定义该函数。在渠道配置的发送前处理函数中选择配置的函数(函数名自己定义)。函数原型:intmqsendfunc(char*buf,intmesslen,CHNL_DEF*chnlP,char*sndbuf)参数:buf:应用消息数据messlen:消息长度chnlP:渠道信息sndbuf:函数处理后返回的数据区。返回值:0成功0失败0返回的数据区大小2.6取报文长度函数(通讯模式为MQ事务模式时必须开发)此函数如果执行成功,则MQ队列中的消息被取走,如果失败,则消息会一直留在MQ队列中。函数原型:intMqrecvmsgTran((char*buf,longmesslen,CHNL_DEF*chnlP))参数:buf:应用消息数据messlen:消息长度chnlP:渠道信息返回值:=0成功0失败3.MQ网关脚本3.1创建MQ脚本(参考附录)要根据网银清算的需要创建MQ脚本,脚本中主要定义的内容是:1)队列管理器名称2)本地队列:包括死信队列、接收队列和传输队列。其中本地队列创建时MSGDLVSQ属性设置为FIFO模式。3)远程队列定义4)通道:包括发送通道和接收通道5)侦听器3.2执行MQ脚本执行MQ创建脚本和启动脚本,并用dspmq查看队列管理器的状态,如果是running,则创建成功。附录(一):MQ脚本创建实例(网银清算脚本):1.创建脚本#!/usr/bin/ksh###消息最大长度exportMAXMSGL=41943040###脉冲信号间隔exportHBINT=60###短重试时间间隔exportSHORTTMR=30###消息压缩算法设置exportCOMPMSG=ZLIBHIGH###MQ日志文件大小设置(单位:4KB)exportLogFilePages=4096###MQ主日志文件最大数exportLogPrimaryFiles=10###MQ辅助日志文件最大数exportLogSecondaryFiles=10###队列管理器前缀exportQmgrPrefix=QMU1000A###设置队列管理器死信队列名称exportDLQ=DLQ###设置IBPS系统的节点代码exportSwiftNodeCode=IBPS###设置消息通道的断开连接时间间隔exportDISCINT=6000###设置消息通道的加密算法exportSSLPEER=###在MQ配置指引中的队列管理器命名规则预留位设置(缺省:_01)exportReserveNo=_01###############################################################################exportCCSID=819exportMAXDEPTH=640000exportTRPTYPE=TCP#设外部接入机构所使用的MQ版本exportMqVer=6.0#设定外部接入机构MQ队列管理器的授权用户exportMqmUsr=mqm#设定外部接入机构内部使用的MQ队列管理器的日志存放路径exportLogPath=/var/mqm/log#exportLogPath=/home/ebmp1/log#设定外部接入机构MQ消息出口函数(只有MQ5.3及之下版本需要配置)exportMSGEXIT=#设定外部接入机构的MQ主机名称和端口#本地绑定IPexportExtHostName=10.1.101.8exportExtHostPort=1449#设定外部接入机构的节点代码和名称exportExtNodeCode=603100000010exportExtOrganDescr=中国光大银行#设定中国人民银行的通用报文传输平台(UMTS系统)的MQ主机名称和端口exportPBCHostName=10.1.101.8exportPBCHostPort=1448#设定中国人民银行的通用报文传输平台(UMTS系统)的节点代码标识exportPBCNodeCode=0001########################################################################创建外部接入机构队列管理器及队列、消息通道######################################################################缺省有256个最大句柄#使用循环日志的方式#LogFilePages5120*4=20M#LogPrimaryFiles50个主Log文件#LogSecondaryFiles30个次Log文件#外部接入机构队列管理器名称#exportQmgrName=$QmgrPrefix$ExtNodeCode$ReserveNoexportQmgrName=$QmgrPrefix#UMTS队列管理器名称exportRemoteQmgrName=QMUMBFEA#创建外部接入机构队列管理器echocreateMQQmgr:$QmgrNamecrtmqm-ld$LogPath-lc-lf$LogFilePages-lp$LogPrimaryFiles-ls$LogSecondaryFiles$QmgrName#启动外部接入机构队列管理器echostartMQQmgr:$QmgrNamestrmqm$QmgrName#设置外部接入机构队列管理器字符集echosetCCSIDofMQQmgr($QmgrName):$CCSIDechoALTERQMGRCCSID($CCSID)|runmqsc$QmgrName#创建及设置外部接入机构队列管理器的死信队列echosetDeadLetterQueueofMQQmgr($QmgrName):$DLQechoDEFINEQLOCAL($DLQ)LIKE(SYSTEM.DEFAULT.LOCAL.QUEUE)+USAGE(NORMAL)DEFPSIST(YES)MAXMSGL($MAXMSGL)+MAXDEPTH($MAXDEPTH)REPLACEDESCR('DeadLetterQueue')|runmqsc$QmgrNameechoALTERQMGRDEADQ($DLQ)|runmqsc$QmgrName#设置外部接入机构队列管理器的消息最大长度echoMaxLengthofMessagesinMQQmgr($QmgrName):$MAXMSGLechoALTERQMGRMAXMSGL($MAXMSGL)|runmqsc$QmgrName#重启外部接入机构队列管理器echorestartMQQmgr($QmgrName)endmqm-w$QmgrNamestrmqm$QmgrNamestrmqcsv$QmgrName#创建服务器连接通道(SVRCONN和SYSTEM.ADMIN.SVRCONN)echocreatechannel(Type:SVRCONN):SVRCONN,SYSTEM.ADMIN.SVRCONNechoDEFINECHANNEL(SYSTEM.ADMIN.SVRCONN)CHLTYPE(SVRCONN)+TRPTYPE($TRPTYPE)MCAUSER('$MqmUsr')MAXMSGL($MAXMSGL)+REPLACE|runmqsc$QmgrNameechoDEFINECHANNEL(SVRCONN)CHLTYPE(SVRCONN)TRPTYPE($TRPTYPE)+MCAUSER('$MqmUsr')MAXMSGL($MAXMSGL)REPLACE|runmqsc$QmgrName#创建外部接入机构的本地接收队列echoDEFINEQLOCAL(MSGMBFE_2)LIKE(SYSTEM.DEFAULT.LOCAL.QUEUE)+USAGE(NORMAL)REPLACEDEFPSIST(YES)MAXDEPTH($MAXDEPTH)+MAXMSGL($MAXMSGL)DESCR('$ExtOrganDescr')+MSGDLVSQ(FIFO)|runmqsc$QmgrNameechoDEFINEQLOCAL(MSGMBFE_1)LIKE(SYSTEM.DEFAULT.LOCAL.QUEUE)+USAG