2012-03-28 42 views
2

在我們的wicket應用程序中,我需要啓動一個長時間運行的操作。它將與外部設備進行通信,並在一段時間後(最多幾分鐘)提供結果。如何處理從檢票口使用工作線程時的序列化?

爪哇式的長期運行操作是通過一種可以提供回調的方法啓動的。

public interface LegacyThingy { 
     void startLegacyWork(WorkFinished callback); 
    } 

    public interface WorkFinished { 
     public void success(Whatever ...); 
     // failure never happens 
    } 

在我的檢票頁我打算添加一個Ajax按鈕來調用startLegacyWork(...)提供適當的回調。對於結果我會顯示一個面板,使用AbstractTimerBehavior輪詢結果。

什麼博格爾斯我心中是以下問題:

爲了保持狀態檢票序列化組件樹與數據一起,因此需要對數據進行包裹在序列化模型(或可拆卸機型)。

因此,爲了保持結果面板和WorkFinished回調之間的「連接」,我需要一些方法在Wicket的「We serializeize everything」世界和「Hey I'm a Java Object沒有人管理我的一生「傳統界面的世界。

我當然可以存儲正在進行的操作在一種全球地圖,並使用一個Wicket可拆卸的模型,看起來他們增長ID ...但是,感覺很髒,我不認爲這是正確的做法。 (它爲這類事情的生命週期開闢了一大堆蠕蟲)。

或者我正在看如何從檢票口做長時間運行操作的完全錯誤的角度?

回答

2

我認爲全球地圖的做法很好。 Wicket在內部也使用類似的東西 - org.apache.wicket.protocol.http.StoredResponsesMap。這是一個保留REDIRECT_TO_BUFFER策略的生成響應的特殊映射。它具有保持最多一些預配置持續時間的條目的邏輯,並且還可以具有條目的上限。

+0

Looking StoredResponsesMap我發現Wicket的MostRecentlyUsedMap至少可以處理一些我不想實現自己的問題(lifetime,max count)。 但是目前我嘗試以另一種方式解決問題(使用較低級別的接口連接舊系統,因爲較低級別的接口給了我一些可序列化的ID以供使用)。 – froh42 2012-04-04 13:37:48

相關問題