2014-03-04 41 views
0

我有一個設計問題,如下所示:我想執行幾個soap web服務,其中每個響應都依賴於前者。 當獲得所有響應時,我想驗證所有獲得的數據,然後基於它創建一些輸出,並從數據庫更新中發出。如何維護自動佈線Web服務中的狀態?

因此我創建了一個TemplateFacade方法,它包裝所有要執行的Web服務。問題:我顯然必須堅持方法調用之間的響應。這將是有問題的,因爲自動裝配服務應該定義爲無狀態並且是單身。

那麼如何使用注入來維護某種狀態的服務(至少在Executor.execute()終止之前)呢?

你能推薦一個更好的設計方法嗎?

@Component 
class Executor { 
    @Autowired 
    TemplateFacade template; 

    public void execute() { 
     template.run(); 
     template.validate(); 
     template.buildOutput(); 
     template.updateDatabase(); 
    } 
} 

@Service 
class TemplateFacade { 
    //service classes wrapping webservice soap execution logic 
    @Autowired 
    PersonSoap personSoap; 

    @Autowired 
    CarSsoap carSoap; 

    @Autowired 
    ServiceDao dao; 

    private WebserviceRsp personRsp, carRsp; 

    void run() { 
     personRsp = personSoap.invoke(); 
     //process response and prepare CarSoapXML accordingly, then send 
     carRsp = carSoap.invoke(); 
    } 

    //the following methods will all 
    void validate() { 
     //validate both responses 
    } 

    void buildOutput() { 
     //create system out based on responses 
    } 

    void updateDatabase() { 
     dao.update(..); 
    } 
} 

回答

1

要在多個Web服務之間共享狀態,您可以跟蹤與用戶綁定的會話中的PersonState。我建議使用加密或散列來保護信息。

驗證完成後,您可以在會話中保留一個PersonState。當buildOutput開始時,您可以獲取PersonState對象並繼續您的邏輯,等等。

保持PersonState具有較小的內存佔用量非常重要。包含大量的數據,你可以創建一個stateObject來爲下一步提供必要的狀態。例如在驗證結束時,您可以創建BuildState對象並將其放入會話中。 build會從會話中獲取對象並繼續。

但我不確定是否真的有必要跟蹤狀態並在2個Web服務調用中完成。更好的解決方案是將所有邏輯部分移動到另一個層,並將Web服務用作業務/流程層的窗口。

編輯:

還有一個解決方案,可以工作,你,就是每一步的響應可能包含所需下一步必要的狀態。例如validateResponse包含personState,並且可以以某種方式傳遞給構建。