Подскажите с непонятной ситуацией.
Вызываю в цикле SAP_WAPI_WORKITEM_COMPLETE по разным потокам. Иногда поток может зависнуть с сообщением "Выполнение прервано SWF_RUN 611" тип ошибки 0 - Временная ошибка. Т.е. последняя задача имеет статус Завершено, а следующая не создается.
Такой поток можно увидеть в транзакции SWPC и вручную продолжить. Либо он сам фоновым заданием SWWERRE протолкнется.
В чем причина?
Массово вызываю выполнение шага вот таким способом.
Сначала был просто цикл с коммитами. Потом добавил блокировку ЭПО. Потом добавил ожидание.
В итоге примерно из 30 потоков один все таки зависает.
Code:
loop at lt_wi_doc into ls_wi_doc.
data lv_counter type i.
add 1 to lv_counter.
try.
data: l_enqueue_object type ref to cl_swf_run_wim_enqueue.
call method cl_swf_run_wim_enqueue=>get_instance
exporting
im_wiid = ls_wi_doc-wi_id
im_enqueue_owner = 'SWW_WI_EXECUTE'
im_wait_for_enqueue = abap_false
receiving
re_instance = l_enqueue_object.
data lx_enq type ref to cx_swf_run_wim_enq_failed.
catch cx_swf_run_wim_enq_failed into lx_enq.
message id lx_enq->t100_msg-msgid type lx_enq->t100_msg-msgty number lx_enq->t100_msg-msgno
with lx_enq->t100_msg-msgv1 lx_enq->t100_msg-msgv2 lx_enq->t100_msg-msgv3 lx_enq->t100_msg-msgv4.
endtry.
data:
lv_rc like sy-subrc,
lt_messages type table of swr_mstruc,
ls_message like line of lt_messages.
call function 'SAP_WAPI_WORKITEM_COMPLETE'
exporting
workitem_id = ls_wi_doc-wi_id
do_commit = abap_false
importing
return_code = lv_rc
tables
simple_container = lt_cont
message_struct = lt_messages.
if lv_rc is not initial.
loop at lt_messages into ls_message where msgty ca 'EAX'.
message id ls_message-msgid type ls_message-msgty number ls_message-msgno
with ls_message-msgv1 ls_message-msgv2 ls_message-msgv3 ls_message-msgv4.
endloop.
if sy-subrc ne 0.
message text-e02 type 'E'.
endif.
endif.
clear: lt_messages.
l_enqueue_object->dequeue( im_enqueue_owner = 'SWW_WI_EXECUTE' im_force_enqueue = abap_false ).
commit work and wait.
data lv_remainder type i.
lv_remainder = lv_counter mod 5.
if lv_remainder eq 0.
wait up to 1 seconds.
endif.
endloop.
В ST22 ничего интересного.
Что еще можно сделать?