几个带有WAIT的aRFC,如何在回调中同步访问变量?

时间:2019-05-04 09:06:42

标签: parallel-processing sap abap

我正在使用异步RFC调用在SAP中进行一些并行工作。在这里您可以看到我的伪代码。

* class variable
data: gv_counter type i .

....

method start_tasks .

    do 10 times .

        call function 'my_remote_function'
            starting new task task_identifier
            calling task_finish on end of task .

    enddo .

    wait for asynchronous tasks until gv_counter eq 10 .    

endmethod .

.....

method task_finish .

    gv_counter = gv_counter + 1 .

endmethod .

如您所见,我开始了10个过程,然后等到它们全部完成。

我的问题是关于方法task_finish和对全局类变量gv_counter的访问。如何确保对变量gv_counter的访问是同步的?

例如在Java中,我会做类似的事情:

synchronized {
    gv_counter += 1 ;
}

1 个答案:

答案 0 :(得分:5)

这是SAP documentation对此主题的引用。

  

加法2

     

... {CALLING meth} | {PERFORMING subr}在任务结束时

     

...

     

如果在程序段中注册了多个回调例程,则在工作流程发生滚动变化时,它们将以不确定的顺序执行。

对我来说,这意味着它们将一个接一个地(按顺序)执行,但是未定义。这意味着您的变量将始终达到10的值。

您实际上可以对其进行调试,以查看在task_finish方法中设置断点时如何依次处理它。这是我的例子。

REPORT ZZZ.

CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
  PUBLIC SECTION.
    CLASS-METHODS:
      main,
      task_finish
        IMPORTING
          p_task TYPE clike.
  PRIVATE SECTION.
    CLASS-DATA:
      gv_counter TYPE i.
    CLASS-METHODS:
      start_tasks.
ENDCLASS.

CLASS lcl_main IMPLEMENTATION.
  METHOD main.
    start_tasks( ).
  ENDMETHOD.

  METHOD start_tasks.
    DATA: l_task TYPE string.
    DO 10 TIMES.
      l_task = sy-index.
      CALL FUNCTION 'Z_ARFC_ECHO'
        STARTING NEW TASK l_task
        CALLING task_finish ON END OF TASK
        EXPORTING
          i_value       = sy-index.

    ENDDO.

    WAIT FOR ASYNCHRONOUS TASKS UNTIL gv_counter = 10.
  ENDMETHOD.

  METHOD task_finish.
    DATA: l_value TYPE sy-index.
    RECEIVE RESULTS FROM FUNCTION 'Z_ARFC_ECHO'
      IMPORTING
        e_echo = l_value.

    WRITE: /, p_task, l_value.

    gv_counter = gv_counter + 1.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  lcl_main=>main( ).

我的RFC如下

FUNCTION Z_ARFC_ECHO.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     VALUE(I_VALUE) TYPE  SY-INDEX
*"  EXPORTING
*"     VALUE(E_ECHO) TYPE  SY-INDEX
*"----------------------------------------------------------------------

e_echo = i_value.

ENDFUNCTION.

同样有趣的是(在文档中也提到过)诸如WRITE之类的列表输出语句没有在这样的处理程序中处理,因此这就是为什么您看不到在执行结束时打印任何内容的原因。上述报告。