您的位置:首页 > 其它

SAP 高级应用开发 学习笔记 1 -- RFC NO.5

2009-11-12 13:52 393 查看
并行RFC方式的RFM调用

实际是异步RFC调用的应用之一。
异步RFC调用实现并行处理:
l        异步RFC调用适用于多个SAP ABAP系统间的并行处理(不支持SAP系统和其他系统间的并行过程)
l        在同一SAP系统内部使用异步RFC调用,将部分处理负载转移到其他的应用服务器,方法时将RFC目标指定为其他应用服务器
l        若不显示指定异步RFC调用目标,在同一应用服务器内,可以通过本地异步RFC调用实现多个工作过程的并行处理
T-CODE: SM59 可将SAP系统中的应用服务器分配成不同的RFC分组,异步调用时,通过DESTINATION子句中的IN GROUP附加项指定一个已定义的RFC分组。若不显示指定RFC组,还可以使 用关键字DEFAULT,系统从全部可用的应用服务器中选择一个处理。

CALL FUNCTION rfm_name

STARTING NEW TASK taskname

DESTINATION IN GROUP g1 ...

[EXPORTING   p1 = a1 ... pn = an ... ]

[TABLES      t1 = itab1 ... tn = itabn ... ]

[EXCEPTIONS  exc1 = e1 ... [MESSAGE mess] ...

excn = en ... [MESSAGE mess] ...

RESOURCE_FAILURE = ...

...

[OTHERS = n_others]].

该项只能在当前SAP系统作为RFC目标时使用。

并行处理的前提条件
l        逻辑独立的工作单元,并行处理并不适合需要顺序进行的数据处理。
l        ABAP要求,功能模块必须设定为远程支持,被调用的功能模块不能包含使目标BACK的远程功能调用,调用程序不能在异步调用之后生成新的内部会话(即不能在call function starting new task语句后使用submit 或 call transaction语句),不能通过call function starting new task destination in group 语句启动外部程序
l        系统中的服务器至少有3个对话工作进程,否则触发RESOURCE_FAILURE异常

例:
REPORT  Z_PRFC_SAMPLE.

TYPES: BEGIN OF task_type,

name TYPE string,

dest TYPE string,

END OF task_type.

DATA: snd_jobs  TYPE i,

rcv_jobs  TYPE i,

exc_flag  TYPE i,

info      TYPE rfcsi,

mess      TYPE c LENGTH 80,

indx      TYPE c LENGTH 4,

name      TYPE c LENGTH 8,

task_list TYPE STANDARD TABLE OF task_type,

task_wa   TYPE task_type.

DO 10 TIMES.

indx = sy-index.

CONCATENATE 'Task' indx INTO name.

CALL FUNCTION 'RFC_SYSTEM_INFO'

STARTING NEW TASK name

DESTINATION IN GROUP DEFAULT

PERFORMING rfc_info ON END OF TASK

EXCEPTIONS

system_failure        = 1  MESSAGE mess

communication_failure = 2  MESSAGE mess

resource_failure      = 3.

CASE sy-subrc.

WHEN 0.

snd_jobs = snd_jobs + 1.

WHEN 1 OR 2.

MESSAGE mess TYPE 'I'.

WHEN 3.

IF snd_jobs >= 1 AND

exc_flag = 0.

exc_flag = 1.

WAIT UNTIL rcv_jobs >= snd_jobs

UP TO 5 SECONDS.

ENDIF.

IF sy-subrc = 0.

exc_flag = 0.

ELSE.

MESSAGE 'Resource failure' TYPE 'I'.

ENDIF.

WHEN OTHERS.

MESSAGE 'Other error' TYPE 'I'.

ENDCASE.

ENDDO.

WAIT UNTIL rcv_jobs >= snd_jobs.

LOOP AT task_list INTO task_wa.

WRITE: / task_wa-name, task_wa-dest.

ENDLOOP.

*&---------------------------------------------------------------------*

*&      Form  rfc_info

*&---------------------------------------------------------------------*

FORM rfc_info USING name.

task_wa-name = name.

rcv_jobs = rcv_jobs + 1.

RECEIVE RESULTS FROM FUNCTION 'RFC_SYSTEM_INFO'

IMPORTING

rfcsi_export = info

EXCEPTIONS

system_failure        = 1 message mess

communication_failure = 2 message mess.

IF sy-subrc = 0.

task_wa-dest = info-rfcdest.

ELSE.

task_wa-dest = mess.

ENDIF.

APPEND task_wa TO task_list.

ENDFORM.                    "rfc_info

 
WAIT UNTILL LOG_EXP UP TO N SECONDS.程序中断时间最长是N秒
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息