2014-08-30 47 views
1

情景
web服務接收來自一些其他系統的XML形式的請求,基於該請求的Web服務應的內容執行任意數量的用戶可定義任務(例如將XML的內容存儲到數據庫,提取某些值,調用其他服務等)。請求系統的行爲不能改變(例如,針對不同的事情調用不同的動作)。設計基於輸入執行的用戶定義的操作的「管道」

提出的設計
我提出的設計將有一個接口類似...

interface PipelineTask { 
    public void Run(String xml); 
} 

隨着每個用戶操作的這個實現,比如...

public class LogToDatabaseTask implements PipelineTask { 
    public void Run(String xml) { 
     db.store(xml); // some call to database to store. 
    } 
} 

然後,一個包含規則(可能是XPath表達式)的數據庫表,以及要調用的類應該由接收的文檔滿足這些規則。然後,我會使用反射 - 或者工廠(?) - 來調用正確的實現並運行它。

問題
對我來說,這聽起來像應該有某種現有的模式來實現這樣的事情,我已經錯過了和網上任何地方都找不到的。這種方法是否合理 - 或者是否有更好的方法,或許更靈活的方法?

回答

1

正如你已經提到的,一個規則似乎很適合這種情況。您可以定義一個規則,該規則採用與當前狀態相關的事實並提供序列中的下一個操作。下面是一個簡單的java規則方法作爲例子。你也可以使用像drools這樣的規則框架。

例如,考慮操作的順序:

UPDATE_DB
EXTRACT_VALUES
INVOKE_XYZ_SERVICE
END

對於每一個網絡從規則的響應可以用一個工廠或策略中使用服務請求在每個步驟後檢查規則並執行操作,直到您收到包含下一個操作END的規則響應。該rulerequest還包含輸入文檔的內容:

public RuleResponse execute(RuleRequest request) { 

    //initialization and extraction code here 
    if(request.previousAction.equals("EXTRACT_VALUES") && ....) { 
     RuleResponse.nextAction = "INVOKE_XYZ_SERVICE". 
    } 

    return response; 
} 
1

我知道你所標記的問題爲Java,但實際上,你可以重複使用很多Pipes & filters design pattern的MSDN邏輯模型。這篇文章非常好,我已經在Java模塊中使用過。

首先,您還可以閱讀關於Pipeline_software的信息 - 這對我有很多幫助。

相關問題