需求的来源
在SAP中经常有碰到队列的情况,比如发送队列(各个系统交互等等),而且这样的情况不在少数,当多个系统同时使用的时候便会导致系统卡死,用户体验差,那么这个时候就要应用到MQ。在开源社区中有Rabbit MQ,那么在SAP中有没有现成可以使用的技术和情况呢?答案是必然的不然本文也不会存在。就是QRFC(Queqe RFC)也称队列RFC。
快速上手
本文旨在十分钟让你懂得如何使用QRFC并将他应用到实际的生产生活。快速上手这项技能
1.创建队列并提交
REPORT ZVRZHENG034.
PARAMETERS:
P_NUM TYPE I DEFAULT 50,
P_IN TYPE TRFCQNAM DEFAULT 'YTEST01_IN',
P_OUT TYPE TRFCQNAM DEFAULT 'YTEST01_OUT',
P_RFC TYPE RFCDEST DEFAULT 'NONE'.
START-OF-SELECTION.
DO P_NUM TIMES.
CALL FUNCTION 'TRFC_SET_QIN_PROPERTIES'
EXPORTING
* QOUT_NAME = P_OUT
QIN_NAME = P_IN
EXCEPTIONS
INVALID_QUEUE_NAME = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE E001(00) WITH 'TRFC_SET_QIN_PROPERTIES error'.
ENDIF.
* CALL FUNCTION 'ZVRZHENG_BGRFC'
CALL FUNCTION 'ZGG'
IN BACKGROUND TASK
DESTINATION P_RFC
AS SEPARATE UNIT
EXPORTING
I_VBELN = '110'.
ENDDO.
COMMIT WORK.
IF SY-SUBRC <> 0.
MESSAGE E001(00) WITH 'Commit error with return code:' SY-SUBRC.
ENDIF.
2.执行队列
CALL FUNCTION 'TRFC_QIN_ACTIVATE' STARTING NEW TASK 'ZVRZHENG'
EXPORTING
QNAME = 'YTEST01_IN'"你要执行的队列
MAXTIME = 3600."最大执行时间
3.监控执行情况 SMQ2
这是待执行状态
这是执行状态
那么截至到这里你已经能以队列的形式调用啦。
多队列并发
很多时候做队列的原因是资源安排的不合理,如果像快速上手中那样只创建一个,那和直接同步等待无异,作为一个合格的ABAPer要榨干CPU的每一丝能效,要节约每一个内存中的1和0。那怎么样在保证系统不卡死的情况下最大化使用CPU的性能,BASIS会给每个系统分一定程度的性能,推荐开的线程在5~8之间(符合大部分BASIS的习惯) 一般10个以下。
1.循环队列
循环队列是指从1到8,8 的下一个到1无限循环的队列。为了使我们的队列均匀的跑,使用循环队列来写入任务让每个队列的数量和运行时间大致相等,保证不会某个队列过于堵塞。具体体现在代码中是这样的。
DATA LV_QIN TYPE TRFCQNAM.
DO 100 TIMES.
LV_QIN = SY-INDEX MOD 7 + 1."Loop时使用sy-tabix
CONDENSE LV_QIN.
LV_QIN = 'VRZHENGTEST' && LV_QIN.
CALL FUNCTION 'TRFC_SET_QIN_PROPERTIES'
EXPORTING
* QOUT_NAME = P_OUT
QIN_NAME = LV_QIN
EXCEPTIONS
INVALID_QUEUE_NAME = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE E001(00) WITH 'TRFC_SET_QIN_PROPERTIES error'.
ENDIF.
CALL FUNCTION 'ZVRZHENG_BGRFC' IN BACKGROUND TASK DESTINATION 'NONE' AS SEPARATE UNIT.
ENDDO.
COMMIT WORK.
2.循环启用队列
循环启用队列,同时多条队列在跑动,并可以讲队列放置在闲置的应用部署中进行。即资源空闲的应用实例,可根据BASIS的设定设置,并且使用多线程的方式调用,挤干服务器的每一滴性能。
DO 8 TIMES.
LV_QIN = SY-INDEX MOD 7 + 1."Loop时使用sy-tabix
CONDENSE LV_QIN.
LV_QIN = 'VRZHENGTEST' && LV_QIN.
CALL FUNCTION 'TRFC_QIN_ACTIVATE' STARTING NEW TASK LV_QIN
EXPORTING
QNAME = LV_QIN
MAXTIME = 7200."最大运行时间,最大可调整至9999
IF SY-SUBRC <> 0.
ENDIF.
ENDDO.