java - 根据输入执行 "pipeline"个用户定义操作的设计

标签 java reflection architecture

场景
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规则方法为例。您还可以使用像 drools 这样的规则框架。规则的响应可以与工厂或策略一起使用:

例如,考虑操作的顺序:

UPDATE_DB
EXTRACT_VALUES
INVOKE_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 - 根据输入执行 "pipeline"个用户定义操作的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25583726/

相关文章:

java - 转换失败异常 : Persisting a DBObject but retrieving returns a LinkedHashMap<? , ?>

java - 了解 Mule ESB 如何适应 JDBC 和 REST

c++ - 运行时检测系统架构 (x86/x64)

c# - 检查类中是否存在属性

scala - 代码执行的并行化/集群选项

rest - 微服务、amqp 和服务注册/发现

java - 如何通过在 Java 中检索异常方法来获取注解?

java - 如何对 MongoDB 文档的字段执行原子更新?

go - 将界面转换为另一个界面并复制内容

php - PHP 反射获取动态实例变量失败