场景
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的文章,它对我的想法帮助很大。