几个带有WAIT的aRFC,如何在回调中同步访问变量?
Several aRFC with WAIT, how to synchronize access to variable in callback?
我正在使用异步 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
和对全局 class 变量 gv_counter
的访问。如何确保对变量 gv_counter
的访问是同步的?
例如在 Java 我会做这样的事情:
synchronized {
gv_counter += 1 ;
}
这里引用了 SAP documentation 关于该主题的引文。
Addition 2
... {CALLING meth}|{PERFORMING subr} ON END OF TASK
...
If multiple callback routines are registered during a program section, they are executed in an undefined order when the work process changes in a roll-in.
对我来说,这意味着它们将一个接一个(按顺序)执行,但未定义。这意味着您的变量将始终达到 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
这样的列表输出语句没有在这样的处理程序中处理,所以这就是为什么你看不到在执行上述报告。
我正在使用异步 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
和对全局 class 变量 gv_counter
的访问。如何确保对变量 gv_counter
的访问是同步的?
例如在 Java 我会做这样的事情:
synchronized {
gv_counter += 1 ;
}
这里引用了 SAP documentation 关于该主题的引文。
Addition 2
... {CALLING meth}|{PERFORMING subr} ON END OF TASK
...
If multiple callback routines are registered during a program section, they are executed in an undefined order when the work process changes in a roll-in.
对我来说,这意味着它们将一个接一个(按顺序)执行,但未定义。这意味着您的变量将始终达到 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
这样的列表输出语句没有在这样的处理程序中处理,所以这就是为什么你看不到在执行上述报告。