《MQ网关优化操作手册v1.2﹎.pdf》由会员分享,可在线阅读,更多相关《MQ网关优化操作手册v1.2﹎.pdf(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、MQ 网关优化操作手册 下面以网银清算为例,来说明怎么使用AE 来定制 MQ 网关。 1. AE 配置说明 1.1 定制网关 在“基本定制 ”-“网关 ” 中右键 “新建 ” ,如下图所示,输入网关号和网关名称, 选择网关类型,点击确定,完成了网关的基本定制。 1.2 动态改变日志级别设置 选择 “渠道 ” ,选中需要设置级别的渠道,如625 渠道,然后选择“外部交易请求” , 如下图所示: 点右键 “ 新建 ”外部交易码为 “0000000000”的外部交易,并设置日志级别,如下图: 这样,使用pbsettranlog 工具就可以动态改变MQ 网关的日志级别。 1.3 处理函数定制 依次选择
2、 “基本定制 ” 、 “ 处理函数 ” 、 “网关相关 ” ,定制需要的函数,图解如下: 1.4 新建 MQ 渠道 双击 “渠道 ” ,在右面的空白处右键“新建 ” ,来新建MQ 渠道。 如下图,输入渠道名称和渠道号,点“下一步 ” 。 选择渠道类别为“服务渠道 (综合渠道 )/S” ,网关号选择在“网关定制 ”中定制的 网关,选中渠道状态“正常 ” 。 输入队列管理器名称、发送队列名、接收队列名、消息生存期、渠道超时时间、 等待接收时间、网关进程数、缓冲区大小等项。 注: 1)其中消息生存期单位是1/10 秒,如果设置成-1,就代表消息永久存在; 2)接收超时时间单位是毫秒; 3)消息缓冲区
3、大小单位是KB ; 4)通讯模式,如果设置成“MQ 事务模式 /5” ,那么会使用事务方式接收MQ 队列的消息。如网银清算,使用的通讯模式是4,不是事务模式;SWIFT 使 用的是模式5,事务模式。 函数的配置如下 如果通讯模式是MQ 事务模式,需要在函数配置中配置“取报文长度函数” 。 2. 接口函数说明 2.1 报文接收后处理函数 在从 MQ 中收到消息后进行处理(如可以进行安全认证),AE 中定义该函数。在 渠道配置的接收后处理函数中选择配置的函数(函数名自己定义,视应用需要开发)。 函数原型: int mqrecvfunc(char *buf,int messlen,CHNL_DEF
4、* chnlP,char *rtnbuf) 参数: buf:mq 消息 messlen:消息长度 chnlP:渠道信息 rtnbuf:函数处理后返回的数据区。 返回值0 成功 0 返回的数据区大小 2.2 获取交易类型函数(请求还是应答交易, 该函数接口必须开发) AE 中定义该函数。在渠道配置的取交易类型函数中选择配置的函数(函数名自 己定义 ,注意加头文件#include ) 。 函数原型: int GetMsgType(char *buf,CHNL_DEF *chnlP,MQMD md) 参数: buf:经报文接收后处理函数处理完返回的数据 chnlP:渠道信息 md:消息描述结构体。
5、返回值: REQUEST (宏)请求 ANSWER (宏)应答 0 失败 2.3 获取外部交易码函数(该函数接口必须开发) AE 中定义该函数。在渠道配置的取交易码函数中选择配置的函数(函数名自己 定义) 。 函数原型: int gettrancode(char *buf,CHNL_DEF *chnlP,char *trancode) 参数: buf:经报文接收后处理函数处理完返回的数据 chnlP:渠道信息 trancode:函数处理后返回的交易码。 返回值: 0 成功 0 失败 2.4 取渠道跟踪码函数(该函数接口必须开发) AE 中定义该函数,在渠道配置的取交易码函数中选择配置的函数。
6、int Chnl_IBPSGetTraceCode(CHNL_DEF *ChnlP, char * rcv_buf, long *TraceCode) 入参:buf 经报文接收后处理函数处理完返回的数据 chnlP 渠道信息 出参: TraceCode:渠道跟踪码。 返回值:0 成功 0 失败 2.5 报文发送前处理函数(该函数接口视需要开发) 在发往 MQ 网关前应用做消息处理(如可以进行安全认证),AE 中定义该函数。 在渠道配置的发送前处理函数中选择配置的函数(函数名自己定义)。 函数原型: int mqsendfunc(char *buf,int messlen,CHNL_DEF *c
7、hnlP,char *sndbuf) 参数: buf:应用消息数据 messlen:消息长度 chnlP:渠道信息 sndbuf:函数处理后返回的数据区。 返回值: 0 成功 0 返回的数据区大小 2.6 取报文长度函数(通讯模式为MQ 事务模式时必须开发) 此函数如果执行成功,则MQ 队列中的消息被取走,如果失败,则消息会一直 留在 MQ 队列中。 函数原型: int MqrecvmsgTran(char *buf, long messlen, CHNL_DEF * chnlP) 参数: buf:应用消息数据 messlen:消息长度 chnlP:渠道信息 返回值: =0 成功 0 失败 3
8、. MQ 网关脚本 3.1 创建 MQ 脚本(参考附录) 要根据网银清算的需要创建MQ 脚本,脚本中主要定义的内容是: 1)队列管理器名称 2)本地队列:包括死信队列、接收队列和传输队列。其中本地队列创建时 MSGDLVSQ 属性设置为FIFO 模式。 3)远程队列定义 4)通道:包括发送通道和接收通道 5)侦听器 3.2 执行 MQ 脚本 执行 MQ 创建脚本和启动脚本,并用dspmq 查看队列管理器的状态,如果是 running,则创建成功。 附录(一): MQ 脚本创建实例(网银清算脚本): 1.创建脚本 #!/usr/bin/ksh # 消息最大长度 export MAXMSGL=41
9、943040 # 脉冲信号间隔 export HBINT=60 # 短重试时间间隔 export SHORTTMR=30 # 消息压缩算法设置 export COMPMSG=ZLIBHIGH # MQ 日志文件大小设置(单位:4KB ) export LogFilePages=4096 # MQ 主日志文件最大数 export LogPrimaryFiles=10 # MQ 辅助日志文件最大数 export LogSecondaryFiles=10 # 队列管理器前缀 export QmgrPrefix=QMU1000A # 设置队列管理器死信队列名称 export DLQ=DLQ # 设置
10、IBPS 系统的节点代码 export SwiftNodeCode=IBPS # 设置消息通道的断开连接时间间隔 export DISCINT=6000 # 设置消息通道的加密算法 export SSLPEER= # 在 MQ 配置指引中的队列管理器命名规则预留位设置(缺省 : _01) export ReserveNo=_01 # export CCSID=819 export MAXDEPTH=640000 export TRPTYPE=TCP #设外部接入机构所使用的MQ 版本 export MqVer=6.0 #设定外部接入机构MQ 队列管理器的授权用户 export MqmUsr=m
11、qm #设定外部接入机构内部使用的MQ 队列管理器的日志存放路径 export LogPath=/var/mqm/log #export LogPath=/home/ebmp1/log #设定外部接入机构MQ 消息出口函数(只有MQ 5.3 及之下版本需要配置) export MSGEXIT= #设定外部接入机构的MQ 主机名称和端口 #本地绑定IP export ExtHostName=10.1.101.8 export ExtHostPort=1449 #设定外部接入机构的节点代码和名称 export ExtNodeCode=603100000010 export ExtOrganDesc
12、r= 中国光大银行 #设定中国人民银行的通用报文传输平台(UMTS 系统 )的 MQ 主机名称和端口 export PBCHostName=10.1.101.8 export PBCHostPort=1448 #设定中国人民银行的通用报文传输平台(UMTS 系统 )的节点代码标识 export PBCNodeCode=0001 # # 创建外部接入机构队列管理器及队列、消息通道 # # 缺省有 256 个最大句柄 # 使用循环日志的方式 # LogFilePages 5120*4 = 20M # LogPrimaryFiles 50 个主 Log 文件 # LogSecondaryFiles
13、30 个次 Log 文件 #外部接入机构队列管理器名称 #export QmgrName=$QmgrPrefix$ExtNodeCode$ReserveNo export QmgrName=$QmgrPrefix #UMTS 队列管理器名称 export RemoteQmgrName=QMUMBFEA #创建外部接入机构队列管理器 echo create MQ Qmgr: $QmgrName crtmqm -ld $LogPath -lc -lf $LogFilePages -lp $LogPrimaryFiles -ls $LogSecondaryFiles $QmgrName #启动外部接
14、入机构队列管理器 echo start MQ Qmgr: $QmgrName strmqm $QmgrName #设置外部接入机构队列管理器字符集 echo set CCSID of MQ Qmgr( $QmgrName ): $CCSID echo ALTER QMGR CCSID($CCSID)|runmqsc $QmgrName #创建及设置外部接入机构队列管理器的死信队列 echo set Dead Letter Queue of MQ Qmgr( $QmgrName ): $DLQ echo DEFINE QLOCAL($DLQ) LIKE(SYSTEM.DEFAULT.LOCAL.
15、QUEUE)+ USAGE(NORMAL) DEFPSIST(YES) MAXMSGL($MAXMSGL)+ MAXDEPTH($MAXDEPTH) REPLACE DESCR(Dead Letter Queue)|runmqsc $QmgrName echo ALTER QMGR DEADQ($DLQ)|runmqsc $QmgrName #设置外部接入机构队列管理器的消息最大长度 echo Max Length of Messages in MQ Qmgr( $QmgrName ): $MAXMSGL echo ALTER QMGR MAXMSGL($MAXMSGL)|runmqsc $Q
16、mgrName #重启外部接入机构队列管理器 echo restart MQ Qmgr( $QmgrName ) endmqm -w $QmgrName strmqm $QmgrName strmqcsv $QmgrName #创建服务器连接通道(SVRCONN 和 SYSTEM.ADMIN.SVRCONN) echo create channel(Type:SVRCONN) : SVRCONN, SYSTEM.ADMIN.SVRCONN echo DEFINE CHANNEL(SYSTEM.ADMIN.SVRCONN) CHLTYPE(SVRCONN)+ TRPTYPE($TRPTYPE)
17、MCAUSER($MqmUsr) MAXMSGL($MAXMSGL)+ REPLACE|runmqsc $QmgrName echo DEFINE CHANNEL(SVRCONN) CHLTYPE(SVRCONN) TRPTYPE($TRPTYPE)+ MCAUSER($MqmUsr) MAXMSGL($MAXMSGL) REPLACE|runmqsc $QmgrName #创建外部接入机构的本地接收队列 echo DEFINE QLOCAL(MSGMBFE_2) LIKE(SYSTEM.DEFAULT.LOCAL.QUEUE)+ USAGE(NORMAL) REPLACE DEFPSIST(
18、YES) MAXDEPTH($MAXDEPTH)+ MAXMSGL($MAXMSGL) DESCR($ExtOrganDescr) + MSGDLVSQ(FIFO)|runmqsc $QmgrName echo DEFINE QLOCAL(MSGMBFE_1) LIKE(SYSTEM.DEFAULT.LOCAL.QUEUE)+ USAGE(NORMAL) REPLACE DEFPSIST(YES) MAXDEPTH($MAXDEPTH)+ MAXMSGL($MAXMSGL) DESCR($ExtOrganDescr)+ MSGDLVSQ(FIFO) |runmqsc $QmgrName #ec
19、ho def qa(MSGMBFE_1) targq(MSGMBFE_2) replace|runmqsc $QmgrName #创建传输队列 echo create Transfer Queues echo DEFINE QLOCAL(PBC.$PBCNodeCode.TRAN) LIKE(SYSTEM.DEFAULT.LOCAL.QUEUE) USAGE(XMITQ) REPLACE+ DEFPSIST(YES) MAXDEPTH($MAXDEPTH) MAXMSGL($MAXMSGL)+ TRIGGER TRIGTYPE(FIRST) INITQ(SYSTEM.CHANNEL.INITQ
20、)+ TRIGDATA(MBA.303100000006A) TRIGDPTH(1)+ DESCR(To IBPS System Transfer Queue)|runmqsc $QmgrName #创建远程队列定义 echo create Remote Queues echo DEFINE QREMOTE(MSGTOMBFEA_1) LIKE(SYSTEM.DEFAULT.REMOTE.QUEUE)+ RNAME(MSGMB_1) RQMNAME($RemoteQmgrName)+ XMITQ(PBC.$PBCNodeCode.TRAN) DEFPSIST(YES) DEFBIND(NOTF
21、IXED)+ REPLACE DESCR(To IBPS System Queue)|runmqsc $QmgrName echo DEFINE QREMOTE(MSGTOMBFEA_2) LIKE(SYSTEM.DEFAULT.REMOTE.QUEUE)+ RNAME(MSGMB_2) RQMNAME($RemoteQmgrName)+ XMITQ(PBC.$PBCNodeCode.TRAN) DEFPSIST(YES) DEFBIND(NOTFIXED)+ REPLACE DESCR(To IBPS System Queue)|runmqsc $QmgrName #创建发送通道 echo
22、create send message channel : echo DEFINE CHANNEL(MBA.303100000006A) CHLTYPE(SDR)+ CONNAME($PBCHostName($PBCHostPort) LOCLADDR($ExtHostName)+ XMITQ(PBC.$PBCNodeCode.TRAN) TRPTYPE($TRPTYPE) REPLACE+ MAXMSGL($MAXMSGL) DISCINT($DISCINT) COMPMSG($COMPMSG)+ HBINT($HBINT) SHORTTMR($SHORTTMR) NPMSPEED(NORM
23、AL)+ SSLPEER($SSLPEER)+ DESCR(To IBPS System Send Message Channel)|runmqsc $QmgrName #创建接收通道 echo create receive message channel : echo DEFINE CHANNEL(303100000006A.MBA) CHLTYPE(RCVR) TRPTYPE($TRPTYPE) REPLACE MAXMSGL($MAXMSGL)+ COMPMSG($COMPMSG) HBINT($HBINT) NPMSPEED(NORMAL)+ SSLPEER($SSLPEER)+ DE
24、SCR(To IBPS System receive Message Channel)|runmqsc $QmgrName #创建和启动侦听器 echo create and start Listener : LSR.$ExtNodeCode echo DEFINE LISTENER(LSR.$ExtNodeCode) TRPTYPE($TRPTYPE)+ PORT($ExtHostPort) CONTROL(QMGR) REPLACE|runmqsc $QmgrName echo START LISTENER(LSR.$ExtNodeCode)|runmqsc $QmgrName #给队列管
25、理器设置权限 setmqaut -m $QmgrName -t qmgr -g dba +all #setmqaut -m $RemoteQmgrName -t qmgr -g dba +all #给队列设置权限 setmqaut -m $QmgrName -n MSGMBFE_1 -t queue -g dba +all setmqaut -m $QmgrName -n MSGMBFE_2 -t queue -g dba +all setmqaut -m $QmgrName -n MSGTOMBFEA_1 -t queue -g dba +all setmqaut -m $QmgrName
26、-n MSGTOMBFEA_2 -t queue -g dba +all 2.启动脚本 export QmgrPrefix=QMU1000A export ReserveNo=_01 export PBCNodeCode=0001 export ExtNodeCode=303100000006 export TRPTYPE=TCP export ExtHostPort=1449 #UMTS 通用报文传输平台队列管理器名称 export RemoteQmgrName=QMUMBFEA #外部接入机构队列管理器名称 export QmgrName=$QmgrPrefix #启动外部接入机构队列管理
27、器 echo start MQ Qmgr: $QmgrName strmqm $QmgrName strmqcsv $QmgrName #启动侦听器 echo start Listener runmqlsr -m $QmgrName -t $TRPTYPE -p $ExtHostPort & runmqsc $QmgrNameEOF start channel(303100000006A.MBA) start channel(MBA.303100000006A) end EOF 3.停止脚本 #!/bin/ksh export QmgrPrefix=QMU1000A #外部接入机构队列管理器名
28、称 export QmgrName=$QmgrPrefix echo end MQ Qmgr: $QmgrName endmqm -i $QmgrName echo end Listener endmqlsr -m $QmgrName 附录(二): 生成 MQ 网关可执行程序pbsendmqsvr 和 pbrecvmqsvr 的 Makefile 示例和说明: 1.示例 Makefile文件的位置 pbranch/code/services/mk.mqgw 2.Makefile 内容 include $(HOME)/etc/pub.mk MQML=/usr/mqm/lib64 MQMI=/us
29、r/mqm/inc MQGWLIB= $(GWLIBS) -lpbmqgw -lmqm -liconv -L$(MQML) -lpthread -lpbutil - lcrypto -lrenhangapi -lunionAPI.useProfile.useSelfBalance RECVMQSVR = $(PB_BINDIR)/pbrecvmqsvr SENDMQSVR = $(PB_BINDIR)/pbsendmqsvr all : $(RECVMQSVR) $(SENDMQSVR) $(RECVMQSVR) : recvmqsvr.o touch recvmqsvr.c echo echo 正在编译$ . - rm $(RECVMQSVR) $(CC_BUILD) recvmqsvr.o $(MQGWLIB) rm recvmqsvr.o $(SENDMQSVR) : sendmqsvr.o touch sendmqsvr.c echo echo 正在编译$ . - rm $(SENDMQSVR) $(CC_BUILD) sendmqsvr.o $(MQGWLIB) rm sendmqsvr.o 3.可执行程序生成方法 make -f mk.mqgw
限制150内