SAP实现异步处理&多线程
starting new task异步处理机制原理,就是开启新的异步处理进程,异步处理在本质上还是需要处理,只是处理的时间不再记到函数执行时间里
进行异步处理时,需考虑以下问题:
1、该接口是否能做成异步处理方式?并非所有的function都能做成异步处理,原因是,该接口执行完成后,后续逻辑是否依赖于该接口的执行结果,如果相互之间有牵连,则不能做成异步处理
2、进行异步处理的时候,进程会在后台开启多少?
3、系统资源是否够用,是否能够承载异步处理方式(比如,内存是否够用,在系统压力很大的时候,系统资源分配均衡?)?
-------------------------------------------------------------------------------
第一步:初始化 server group ,server group 可以用RZ12进行维护,参数支直复制即可,不要修改。
CONSTANTS: serv_group LIKE rzllitab-classname VALUE 'JOBRUN'.
CALL FUNCTION 'SPBT_INITIALIZE'
EXPORTING
group_name = serv_group
* IMPORTING
* MAX_PBT_WPS =
* FREE_PBT_WPS =
EXCEPTIONS
invalid_group_name = 1
internal_error = 2
pbt_env_already_initialized = 3
currently_no_resources_avail = 4
no_pbt_resources_found = 5
cant_init_different_pbt_groups = 6
OTHERS = 7.
第二步:分别写多个FM的调用,注意:如果多个FM都共用的参数, 数据写在主程序中,然后用参数传到FM里。
CALL FUNCTION 'Z_ BAPI_FM1'
STARTING NEW TASK 'FM1TASK'
DESTINATION IN GROUP serv_group
PERFORMING sub_fm1_back ON END OF TASK
TABLES
date_ra = date_ra.
CALL FUNCTION 'Z_BAPI_FM2'
STARTING NEW TASK 'FM2TASK'
DESTINATION IN GROUP serv_group
PERFORMING sub_FM2_back ON END OF TASK
TABLES
date_ra = date_ra.
第三步.FM执行完之后数据反回,数据返回的参数是全局的,在Z_BAPI_FM*中对全局参数进行赋值。
FORM sub_fm1_back USING name.
RECEIVE RESULTS FROM FUNCTION 'Z_BAPI_FM1'
TABLES
ret_par = gdt_ret_pars "返回的参数
return = gdt_gr_return.
APPEND LINES OF gdt_gr_return TO gdt_return.
gr_flag = 'X'. "这个很重要,根据这个参数判断FM是否执行完毕
ENDFORM. "sub_fm1_back
FORM sub_fm2_back USING name.
RECEIVE RESULTS FROM FUNCTION 'Z_BAPI_FM2'
TABLES
returnpo = gdt_ret_pos
return = gdt_returnpo_return.
APPEND LINES OF gdt_returnpo_return TO gdt_return.
returnpo_flag = 'X'.
ENDFORM. "sub_fm2_back
第四步:收尾工作,判断各个FM是否执行完毕
WAIT UNTIL gr_flag = 'X' AND returnpo_flag = 'X' .
ret_pars[] = gdt_ret_pars. “返回的结果
returnpo[] = gdt_ret_pos. “返回的结果
APPEND LINES OF gdt_return TO return. “最终返回的return ,一般FM都有返回值,返回错误,警告等信息。
-------------------------------------------------------------------------------
Technical Settings
1. Target system: 目标系统名称 TCODE SM59 维护远程目标
2. Message server 目标系统的消息服务器 T-CODE RZ03 Service 栏中带有”M”字符的 为消息服务器
3. Group 服务器组 Tcode SMLG 可以查看
4. Target host (目标系统的主机或IP地址) SM51 中的HOST name字段
5. System number(目标系统的系统编号)
异步调用
异步RFC也要求RFC服务器系统在调用时可用, 被调用的function module 将立即启动并运行,区别于同步调用, 调用程序不等待远程调用结果,而继续运行, 远程功能处理与调用程序的处理过程相分离,功能返回结果可以在后续过程中被接收.
语法
CALL FUNCTION rfm_name
START NEW TASK taskname
….
异步RFC调用时接收结果
CALL FUNCTION rfm_name
START NEW TASK taskname
PERFORMING return_form ON END OF TASK
子程序必须存在于程序中
FORM return_form USING taskname
RECEIVE RESULTS FROM FUNCTION rfm_name
ENFORM
并行RFC方式的RFM调用
并行RFC实际上是异步RFC调用的应用之一
1. 首先异步RFC调用适用于多个SAP ABAP系统间的并行处理(不支持非SAP系统)
2. 可以在同一个系统内部使用异步RFC调用,并将部分处理负载转移到其它的应用服务器上.
3. 如果不现实指定异步RFC调用的目标,则在同一应用服务器内,也可以通过本地异步RFC调用实现多个工作过程的并行处理
分组并行处理的语法
CALL FUNCTION rfm_name
STARTING NEW TASK taskname
DESTINATION IN GROUP g1
….
EXCEPTION
RESOURCE_FAILURE = ..
并行处理条件
逻辑独立的工作单元(logically-independent units of work):并行处理并不适合需要顺序进行的数据处理.各个数据处理过程不能具有依赖关系
ABAP要求
被调用的功能模块程序中不能包含使用目标back的远程功能调用
调用程序不能在异步调用之后生成新的内部会话
不能通过 call function starting new task destination in group 语句启动外部程序
系统资源要求
为了处理并行作业, sap系统中至少要有三个对话工作过程. 调度队列(dispatcher queue)必须低于10%满载,而且至少要有一个空闲对话工作过程用于处理并行作业中的任务,并保留两个空闲的工作过程处理系统登陆及管理任务.
事务性RFC
通过事务RFC调用,可以将多个逻辑上相关的远程调用绑定到一个LUW上.在该LUW内,所有调用按其调用顺序,在目标系统的相同程序上下文中以单个事务的方式执行,要么执行所有,要么完全回滚.
语法
CALL FUNCTION rfm_name
IN BACKGROUND TASK
….
或者
CALL FUNCTION rfm_name
IN BACKGROUND UNIT oref
….
事务RFC 调用不能直接接收或通过 receive results from fucntion 来接收rfm的返回结果.
模块中不应该指定任何 export类型参数.
队列RFC 方式
要确保事务性RFC中的LUW都按照其创建磁学执行,需要使用队列RFC创建LUW序列