2014-08-30 31 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的信息 - 这对我有很多帮助。

相关问题