2017-10-10 92 views
1

我正在研究如何构建一个通用应用程序或微服务来启用构建以工作流为中心的应用程序。我已经完成了一些关于框架的研究(见下文),最有前途的候选人很难依赖RDBMS来存储与JPA注释实体相结合的工作流和过程状态。在我看来,这会损害设计一个通用的,数据驱动的工作流微服务的可能性。通过以JSON或XML格式存储数据对象和规则,似乎可以在MondoDB或Cassandra等NoSQL解决方案上构建真正的通用工作流系统。这些将允许执行代码来执行类型或模式,同时使用一个或两个简单的Java对象来检索和保存实体。正如我所看到的,这可以使单个应用程序作为控制器部署在不同域的模型 - 视图对中,无需修改(无可否认,该界面提供了非常聪明的界面)。NoSQL支持BPM的成熟Java工作流引擎吗?

我试图找到支持NoSQL后端的工作流引擎/ BPM框架。我找到的最接近的是Activiti-Neo4J,这似乎是一个废弃的项目,启用了Activity和Neo4J之间的连接器。

是否有Java Work Engine/BPM框架支持NoSQL后端并在不需要特定POJO实体的情况下概括数据对象?

如果我放弃我的理想,神奇的一般解决方案,我可能会选择一个框架,如jBPMActivi,因为它们具有很好的功能集并且已经成熟。在试图找到其他候选人时,我发现了一个名副其实的废弃项目坟墓,如this one on Java-Source.net

+0

如果您选择downvote,请发表评论。如果有什么方法可以改善我的问题,我想知道。我知道https://stackoverflow.com/help/on-topic建议不要问图书馆建议的问题,但事实是(1)StackOverflow中的这些问题首先帮助我研究这个问题,并且(2)任何这个问题的答案可以帮助我恢复我的搜索,因为我已经死了。 – sadakatsu

回答

0

Activiti项目的设计人员也意识到了你所说的问题,但知道实现这样的灵活性是可以重新编写的,而这种灵活性应该从一开始就被设计到项目中。正如您在下面提供的链接中所看到的,问题在于除了关系数据库之外,缺乏接口来编写不同的实现。随着版本6,他们继续前进,撕掉了bandaid,并用一组接口为不同的实现(认为Neo4J,MongoDB或任何其他持久性技术,你喜欢)可以编写和插入。

在在下面的链接文章中,他们提供了一些简单的内存中实现上述接口的代码示例。看起来很酷,听起来也许正是你想要的。

https://www.javacodegeeks.com/2015/09/pluggable-persistence-in-activiti-6.html

0

我想,为什么工作流引擎往往是基于RDBMS的原因不是数据库模式,但更多的组合到一个事务安全的数据存储。 事务健壮性是工作流引擎的一个重要因素,特别是对于复杂工作流程中典型的长时间运行或嵌套事务。 所以,也许这就是为什么大多数引擎(如activi)不关注数据驱动方法的原因之一。 (我不是在谈论这里的数据复制,在大多数情况下,NoSQL数据库覆盖了这些数据复制)

如果您看一下Imixs-Workflow Project,您会发现一种基于Java Enterprise的不同方法。该引擎使用通用数据对象,该对象可以使用任何类型的可序列化的数据值。使用Lucene Search技术解决了数据检索问题。每个对象都被翻译成具有每个项目的名称/值对的虚拟文档。这样可以轻松搜索已处理的业务数据,也可以查询状态信息或流程所有者等结构化工作流数据。所以这是一个可能的解决方案。

除此之外,您始终可以选择将业务数据存储到NoSQL数据库中。这与正在运行的流程实例的工作流数据无关,只要将两个对象链接在一起即可。 回到事务健壮性的方面,将对NoSQL数据存储的引用存储到流程实例中是一个好主意,这是事务感知。再看看here

所以唯一可以解决的问题是,事务上下文从EJB/JPA同步到'外部'NoSQL数据库非常困难。例如:当您的数据成功保存到NoSQL数据存储(例如Casnadra)时,您将如何处理,但工作流引擎的事务失败并触发角色后退?