【问题标题】:Design for executing a "pipeline" of user-defined actions based on input基于输入执行用户定义操作的“管道”的设计
【发布时间】:2014-09-12 18:53:58
【问题描述】:

场景
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 reflection architecture


    【解决方案1】:

    正如您已经提到的,一条规则似乎很适合这种情况。您可以定义一个规则,该规则采用与当前状态相关的事实并提供序列中的下一个操作。下面是一个简单的java规则方法作为例子。您还可以使用像 drools 这样的规则框架。规则的响应可以与工厂或策略一起使用:

    例如,考虑动作的顺序:

    UPDATE_DB
    EXTRACT_VALUES
    INVOKE_XYZ_SERVICE
    结束

    对于每个 Web 服务请求,在每个步骤后检查规则并执行操作,直到您收到带有下一个操作 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;
    }
    

    【讨论】:

      【解决方案2】:

      我知道您将问题标记为Java,但实际上您可以重用Pipes & filters design pattern 的很多MSDN 逻辑模型。这篇文章非常好,我已经在 J​​ava 模块中使用过。

      首先你也可以阅读这篇关于Pipeline_software 的文章——它对我的想法很有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        • 1970-01-01
        • 2014-03-11
        • 1970-01-01
        相关资源
        最近更新 更多