基于输入执行用户定义操作"pipeline"的设计



场景
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表达式),以及在接收到的文档满足这些规则时要调用的类。然后我会使用反射——或者可能是一个工厂(?)——来调用正确的实现并运行它

问题
对我来说,听起来应该有某种现有的模式来实现这样的东西,我错过了,在网上找不到。这种方法有意义吗?或者有更好的、也许更灵活的方法吗?

正如您已经提到的,规则似乎非常适合这种情况。您可以定义一个规则,该规则接受与当前状态相关的事实,并提供序列中的下一个操作。下面是一个简单的java规则方法示例。你也可以使用规则框架,比如流口水。规则的响应可以与工厂或策略一起使用:

例如,考虑动作序列:

更新_DB
EXTRACT_VALUES
发票_XYZ_SERVICE
结束

对于每个web服务请求,在每个步骤后检查规则并执行操作,直到收到带有下一个操作END的规则响应。规则请求还包含输入文档的内容:

public RuleResponse execute(RuleRequest request) {
    //initialization and extraction code here
    if(request.previousAction.equals("EXTRACT_VALUES") && ....) {
        RuleResponse.nextAction = "INVOKE_XYZ_SERVICE".
    }
    return response;
}

我知道您将这个问题标记为Java,但实际上您可以重用Pipes&过滤器设计模式。这篇文章非常好,我已经在Java模块中使用过了。

首先,您还可以阅读这篇关于Pipeline_software的文章,它对我的想法帮助很大。

相关内容

  • 没有找到相关文章

最新更新