BC415学习笔记(二) Asynchronous RFC

第二章srfc就没做笔记了,毕竟同步rfc应该时平时用的最多的,感觉没啥好写的

arfc的调用处理流程如下

 

 

arfc注意事项:

1、每次函数调用都会生成一个DIA类型的进程,可在事务码SM50中查看,使用异步调用时需注意控制生成的进程数量,防止进程全部占完导致其他正常业务排队或数据库提交错误

2、arfc调用时没有返回参数和异常捕获(communication_failure和system_failure这两个异常除外),返回参数和异常捕获放在获取返回参数的form中

3、需保证所有异步任务执行结束再开始后续程序的执行,否则容易漏掉数据

 arfc调用测试,获取500个物料的mrp数据,以及并发执行和单线程执行的效率对比

CONSTANTS:con_max_available_thread TYPE i VALUE 10.

DATA:lt_mrp_be TYPE TABLE OF zmrp_be_s.
DATA:lt_mrp_ar TYPE TABLE OF zmrp_ar_s.
DATA:lt_mrp_vc TYPE TABLE OF zmrp_vc_s.
DATA:lt_mrp_vj TYPE TABLE OF zmrp_vj_s.
DATA:lt_mrp_po TYPE TABLE OF zmrp_be_s.
DATA:lt_mrp_ot TYPE TABLE OF zmrp_ot_s.
DATA:lt_supply_sto TYPE TABLE OF zsupply_sto_s.
DATA:lt_supply_po_qm TYPE TABLE OF zsupply_sto_s.
DATA:lt_supply_po_tr TYPE TABLE OF zsupply_sto_s.
DATA:lt_mrp_request TYPE TABLE OF zmrp_request_s.
.
DATA:gt_marc TYPE TABLE OF zmrp_mara_s.
DATA:gs_marc TYPE zmrp_mara_s.

DATA:lv_task_name TYPE c LENGTH 15.
DATA:lv_free_thread_num TYPE i.

SELECT marc~werks marc~matnr marc~ekgrp marc~eisbe marc~eislo marc~dispo matkl maktx INTO CORRESPONDING FIELDS OF TABLE gt_marc UP TO 500 ROWS
  FROM marc
  INNER JOIN mara ON marc~matnr EQ mara~matnr
  INNER JOIN makt ON marc~matnr EQ makt~matnr
  WHERE marc~lvorm EQ space
    AND ( marc~beskz EQ 'X' OR marc~beskz EQ 'F' )
    AND ( marc~mmsta NE 'Z3' AND marc~mmsta NE 'Z4' AND marc~mmsta NE 'Z3' AND marc~mmsta NE 'Z7' )
    AND makt~spras EQ sy-langu
    AND marc~werks = '1010'.

PERFORM frm_multiple_threads.

PERFORM frm_sigle_thread.

FORM frm_sigle_thread.

  LOOP AT gt_marc INTO gs_marc..
    CALL FUNCTION 'ZRFC_GET_MRP_DATA'
      EXPORTING
        is_mara         = gs_marc
      TABLES
        et_mrp_be       = lt_mrp_be
        et_mrp_ar       = lt_mrp_ar
        et_mrp_vc       = lt_mrp_vc
        et_mrp_vj       = lt_mrp_vj
        et_mrp_po       = lt_mrp_po
        et_mrp_ot       = lt_mrp_ot
        et_supply_sto   = lt_supply_sto
        et_supply_po_qm = lt_supply_po_qm
        et_supply_po_tr = lt_supply_po_tr
        et_mrp_request  = lt_mrp_request.
  ENDLOOP.

endform.

FORM frm_multiple_threads.

  SORT gt_marc BY werks matnr.
*---执行获取MRP
  LOOP AT gt_marc INTO gs_marc.
    lv_task_name = 'TASK' && sy-tabix.

    lv_free_thread_num = lv_free_thread_num + 1.

    CALL FUNCTION 'ZRFC_GET_MRP_DATA' STARTING NEW TASK lv_task_name PERFORMING receive_result ON END OF TASK
      EXPORTING
        is_mara = gs_marc.

    WAIT UNTIL lv_free_thread_num <= con_max_available_thread.

  ENDLOOP.

  "确保所有异步任务执行完毕
  WAIT UNTIL lv_free_thread_num <= 0 UP TO 1200 SECONDS.

ENDFORM.


FORM receive_result USING taskid TYPE clike.

  lv_free_thread_num = lv_free_thread_num - 1.

  RECEIVE RESULTS FROM FUNCTION 'ZRFC_GET_MRP_DATA'
    TABLES
      et_mrp_be       = lt_mrp_be
      et_mrp_ar       = lt_mrp_ar
      et_mrp_vc       = lt_mrp_vc
      et_mrp_vj       = lt_mrp_vj
      et_mrp_po       = lt_mrp_po
      et_mrp_ot       = lt_mrp_ot
      et_supply_sto   = lt_supply_sto
      et_supply_po_qm = lt_supply_po_qm
      et_supply_po_tr = lt_supply_po_tr
      et_mrp_request  = lt_mrp_request.

  IF sy-subrc = 0.
*    APPEND LINES OF lt_mrp_be TO gt_mrp_be.
*    APPEND LINES OF lt_mrp_ar TO gt_mrp_ar.
*    APPEND LINES OF lt_mrp_vc TO gt_mrp_vc.
*    APPEND LINES OF lt_mrp_vj TO gt_mrp_vj.
*    APPEND LINES OF lt_mrp_po TO gt_mrp_po.
*    APPEND LINES OF lt_mrp_ot TO gt_mrp_ot.
*    APPEND LINES OF lt_supply_sto TO gt_supply_sto_data.
*    APPEND LINES OF lt_supply_po_qm TO gt_supply_po_qm_data.
*    APPEND LINES OF lt_supply_po_tr TO gt_supply_po_tr_data.
*    APPEND LINES OF lt_mrp_request TO gt_request_data.
  ENDIF.

ENDFORM.

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值