2017-04-04 13 views
0

我今天有一個關於WAIT的用法的問題。 我與一個內部源代碼質量團隊合作,負責審查您的代碼並批准它。不幸的是,WAIT UP TO x SECONDS指令的使用現在被禁止且不可協商。如何替換WAIT,以避免鎖定錯誤並釋放內存

問題
CALL FUNCTION 'ANY_FUNCTION_WITH_LOCK'. 

CALL FUNCTION 'ANY_FUNCTION_WITH_LOCK_2'. 

如果我執行該僞代碼中,我將有錯誤(鎖定的對象),因爲我使用的共享對象(I使用功能模塊,而不同步/異步模式)。

我可以通過使用WAIT來解決此問題。

CALL FUNCTION 'ANY_FUNCTION_WITH_LOCK'. 

WAIT UP TO 5 SECONDS. " or 1, 2, 3, 4, 5, ... seconds <------------ 

CALL FUNCTION 'ANY_FUNCTION_WITH_LOCK_2'. 

利用這種方法(和std功能)時,系統將停止,並等待一個特定的時間。 但是,有時系統需要1秒...或更多。我們無法知道確切的時間。

但是,如果我們有大量對象的循環中執行此代碼後,系統可以在一個無限時間,直到內存轉儲等。

(受影響的功能都與VL32N,QA11,......和他們的對象)

需要

需要的是如何更換WAIT指令? 我們需要找到一個解決方案/函數具有相同的行爲WAIT UP TO,但不會影響到(或更少)的內存水平(轉儲,資源過度消耗,...)

事實上我們需要像COMMIT WORK AND WAIT之類的東西,但是有一個函數的結果而不是數據庫。

解決方案?

  • 使用時間戳comparaison一個循環,並用ENQUEUE_READ獲取鎖定的對象的清單,並檢查所需要的對象是在這份名單中,直到X secondes。 看來這個解決方案需要與WAIT相同的資源級別。

  • ENQUE_SLEEP似乎有對內存(How to make an abap program pause?

  • 重構所有的代碼已經完成等待相同的行爲,並使用同步功能。

還有什麼?任何想法 ?它甚至有可能嗎?

感謝提前:)

+0

這兩個函數都是異步RFC還是它們使用'UPDATE TASK'?首先,我將重點介紹爲什麼首先引入了「等待5秒鐘」,在你的問題中沒有任何關於它的內容。擺脫「等待x秒鐘」意味着你至少希望第一個功能模塊是同步的,從我的觀點來看,唯一合理的解決方案是使它同步。另一種解決方案是引入一個重試計數器,但不用等待,然後重試直到鎖定被釋放或計數器已經啓動。 – Jagger

+0

你想說這個程序由於這個WAIT'聲明而變得愚蠢嗎?這就是爲什麼你想刪除它們? – Suncatcher

+0

這些標準FM嗎?是否有可用於替代FM的BAPI? – Brian

回答

1

爲什麼不只是把支票在兩個功能模塊之間的鎖?你可以把它放在一個循環中,一旦鎖定從FM 1清除,就退出循環。

+0

如果由於某種原因沒有清除該怎麼辦? – Jagger

+0

您將需要對循環遍數的限制。限制取決於你在做什麼 - 一些進程可能容忍比其他進程更長的等待時間。 –

0

當我想等待指定的時間並重新檢查某些內容時,我使用了ENQUE_SLEEP。例如,您可以等待5秒鐘,然後檢查鎖的存在。如果對象不再鎖定,則繼續。如果鎖仍然存在,再次入睡。爲了避免無限循環,在放棄並記錄某種錯誤之前,您必須對您願意睡眠的次數進行限制。

WAIT的問題是觸發隱式提交。 ENQUE_SLEEP不會那樣做。