2014-02-19 63 views
0

我已使用InternalProfileFormHandler添加項目InternalProfileRepository。它已成功將項目(用戶:iuser310002)添加到目標存儲庫。一旦添加,我已經訪問dyn/admin打開存儲庫,並刪除了我剛剛使用<remove-item item-descriptor="user" id="iuser310002" />添加的項目。然後我再次調用InternalProfileFormHandler來添加一個項目。然而這一次,我有atg.repository.RemovedItemExceptionAttempt to use an item which has been removed: user:iuser310002.atg.repository.RemovedItemException嘗試將項目添加到存儲庫時

我不知道爲什麼它試圖創建一個新的用戶具有相同的ID和以前一樣,即使我這樣做,爲什麼被刪除的項目應該會導致此問題。我使用InternalProfileRepository的默認IDGenerator /atg/dynamo/service/IdGenerator,所以我不認爲我會生成相同的ID。

下面是成功創建了項目一次,從第二次錯誤的代碼...

FormHandlerInvoker invoker = new FormHandlerInvoker("/atg/userprofiling/InternalProfileFormHandler", Nucleus.getSystemNucleus()); 

try { 
    String paramName; 
    int paramCounter = 1; 
    while((paramName = (String) getCurrentTestParams().get("param" + paramCounter)) != null) 
    { 
     invoker.addInput(paramName, (String) getCurrentTestParams().get("value" + paramCounter)); 
     paramCounter++; 
    } 
} catch (ServletException e) { 
    e.printStackTrace(); 
} 
FormHandlerInvocationResult result; 
ProfileFormHandler formHandler = null; 
try { 
    result = invoker.invoke(); 
    formHandler = 
    (ProfileFormHandler)result.getDefaultFormHandler(); 
    formHandler.handleCreate(result.getRequest(), result.getResponse()); 
} 

以下是異常日誌...這是由formHandler.handleCreate方法調用引起的。

atg.repository.RemovedItemException: Attempt to use an item which has been removed: user:iuser310002 
    at atg.adapter.gsa.ItemTransactionState.<init>(ItemTransactionState.java:385) 
    at atg.adapter.gsa.GSAItem.getItemTransactionState(GSAItem.java:2421) 
    at atg.adapter.gsa.GSAItem.getItemTransactionState(GSAItem.java:2364) 
    at atg.adapter.gsa.GSAItem.getItemTransactionStateUnchecked(GSAItem.java:2600) 
    at atg.adapter.gsa.GSAItem.getPropertyValue(GSAItem.java:1511) 
    at atg.repository.RepositoryItemImpl.getPropertyValue(RepositoryItemImpl.java:151) 
    at atg.adapter.composite.CompositeItem.createPropertyQuery(CompositeItem.java:739) 
    at atg.adapter.composite.CompositeItem.getPropertyLinkedItem(CompositeItem.java:630) 
    at atg.adapter.composite.CompositeItem.getContributingItem(CompositeItem.java:577) 
    at atg.adapter.composite.CompositeItem.findContributingItem(CompositeItem.java:561) 
    at atg.adapter.composite.MutableCompositeItem.findContributingItem(MutableCompositeItem.java:971) 
    at atg.adapter.composite.MutableCompositeItem.getOrCreateContributingItem(MutableCompositeItem.java:985) 
    at atg.adapter.composite.MutableCompositeItem.setPropertyValue(MutableCompositeItem.java:210) 
    at atg.userprofiling.ProfileForm.updateProfileAttributes(ProfileForm.java:3761) 
    at atg.userprofiling.ProfileForm.updateProfileAttributes(ProfileForm.java:3528) 
    at atg.userprofiling.ProfileForm.createUser(ProfileForm.java:1507) 
    at atg.userprofiling.ProfileForm.handleCreate(ProfileForm.java:1214) 
    at atg.userprofiling.ProfileFormHandler.handleCreate(ProfileFormHandler.java:402) 
    at atg.scenario.userprofiling.ScenarioProfileFormHandler.handleCreate(ScenarioProfileFormHandler.java:599) 
    at atg.test.steps.CreateInternalUserStep.runTest(CreateInternalUserStep.java:45) 

回答

0

經過一番挖掘,我找出原因。與創建用戶一起,會話也會自動爲同一用戶創建。通過在dyn/admin中轉到此路徑可以找到用戶。 /atg/dynamo/servlet/sessiontracking/GenericSessionManager/notdefined/atg/userprofiling/Profile/

下一次當我刪除I​​nternalProfileRepository中的項目時,該項目正在成功刪除,但會話對象仍然存在。

當我再次調用formhandler.handleCreate時,它正在檢查配置文件對象是否存在。當它找到用戶時,它試圖更新同一個用戶而不是創建一個新用戶。因此我得到RemovedItemException。

但是,我不太確定這是否是預期的。

+0

這基本上是如何工作的。因此,爲了讓您刪除配置文件,您需要先註銷(或終止會話),然後再調用RemoveItem。 – radimpe

+0

aaah ...感謝您的確認。不過,我有一個疑問,當我們添加一些測試數據並在測試後刪除它們時,我們也遇到了這個問題。在測試之前添加不是配置文件數據,一些新的目錄等,並在測試之後移除。當我們嘗試在不重新啓動服務器的情況下再次運行測試時,這會導致問題中提到的問題。你有建議嗎?會在這裏殺死會議作品嗎? – Buddha

+0

您正在運行多少個實例以及您設置了哪種類型的緩存?也許這也是你的問題。刪除項目後,清除存儲庫緩存並查看它是否仍然存在問題。 – radimpe

相關問題