使用Infinispan创建自己的Drools和jBPM持久性

我 在这里发表的原始文章:

您好,欢迎来到我打算向您展示如何创建自己的Drools和jBPM持久性实现的帖子。 我已经为流口水对象开发了基于infinispan的持久性方案,并且在此过程中学到了很多东西。 如果您想做某种事情,我打算给您一些指导。

为什么?


如果您正在阅读本文,那么您可能已经有了一个“为什么”来重新定义流口水使用的持久性方案,但是回顾一些很好的理由来做这样的事情是很好的。 最重要的是,您可能会认为出于一个或多个原因,为流口水设计的JPA持久性方案无法满足您的需求。 我发现的一些最常见的是:

给定的模型不足以进行我的设计:为持久化流口水组件(会话,流程实例,工作项等)而创建的当前对象当前尽可能小,以使数据库具有最佳性能,并且大部分可操作数据存储在映射到Blob对象的字节数组中。 这种方案足以使drools和jBPM运行时正常运行,但对于您的域可能还不够。 您可能希望将运行时信息保存在一种方案中,该方案更易于从外部工具查询,而这样做则需要丰富数据模型,甚至创建自己的模型。

我正在使用的持久性与JPA不兼容:目前有很多持久性实现不再使用我们曾经知道的数据库(分布式缓存,键值存储,NoSQL数据库),并且该模型通常需要额外的映射和特殊功能坚持存放在这样的仓库中。 这样做,有时JPA并不是我们的理想之选

每次加载drools组件时,我都需要从不同的来源加载特殊实体:当我们拥有复杂的对象和/或外部数据库时,有时我们希望新模型以特殊的方式与我们拥有的对象相关联。 也许我们想确保我们的会话以特殊的方式绑定到我们的模型,因为这对我们的业务模型有意义。 为此,我们必须更改模型

怎么样?

为了为我们的会话创建自己的持久性方案,我们需要清楚地了解JPA方案是如何构建的,并将其用作构建自己的持久性方案的模板。 此类图显示了如何实现知识会话的JPA持久性方案:

看起来很复杂,对吧? 不用担心 我们将逐步了解它的工作原理。

首先,您可以看到我们有两个StatefulKnowledgeSession的实现(或者,如果您使用的是Drools 6,则为KieSession )。 一个完成所有“管脚魔术”的任务是StatefulKnoweldgeSessionImpl ,而我们将要使用的任务是CommandBasedStatefulKnowledgeSession 。 它与持久性无关,但是通过将每个方法调用都包含在命令对象中并将其执行导出到命令服务中,对持久性有很大帮助。 因此,例如,如果您对这种类型的会话调用fireAllRules方法,它将创建一个FireAllRulesCommand对象,并将其交给另一个类执行。

这种基于命令的实现使我们能够准确地完成在drools环境中实现持久性所需的工作:它使我们能够在对会话的每次方法调用之前和之后实现操作。 那就是SingleSessionCommandService的地方
该类很方便:此命令服务包含一个StatefulKnowledgeSessionImpl和一个PersistenceContextManager。 每次必须执行命令时,此类都会创建或加载SessionInfo对象,并告诉持久化上下文将其与StatefulKnowledgeSessionImpl的所有状态一起保存。

那是最复杂的部分:实现会话持久性的部分。 几乎所有其他内容的持久性都可以通过一组给定的接口轻松完成,这些接口提供了一些方法来实现如何加载与会话相关的所有其他内容(流程实例,工作项和信号)。 只要创建一个合适的经理及其工厂,就可以委托他们将任何东西存储到任何地方(或者做任何您想做的事情)。

因此,看完所有组件之后,现在是开始思考如何创建自己的实现的好时机。 在此示例中,我们创建了一个基于Infinispan的持久性方案,并将向您展示实现该方案的所有步骤。

步骤1 :(重新)定义模型

在大多数情况下,当我们想以自己的方式持久流口水时,我们可能会想尽办法做到。 即使我们不希望更改模型,也可能需要向模型添加特殊注释才能与您的存储框架一起使用。 另一个原因可能是您想以一种特殊的方式存储所有事实,以便与其他旧系统进行交叉查询。 只要您了解所创建的模型,那么每次您在知识会话上调用方法时,持久性方案都会对它进行序列化和反序列化,就可以按照您希望的方式进行字面上的重新定义。因此,请始终尝试使其保持简单。

这是我们为这种情况创建的模型:

没什么花哨的,只是流口水相关的所有事物的扁平化模型。 我们对这种模型不太有想像力,因为我们只是想向您显示可以更改它。

在该模型中要注意的一件事是,我们仍然保存这些对象的所有内部数据的方式与为JPA持久性存储数据的方式几乎相同。 唯一的区别是JPA将其存储在Blob中,而我们将其存储在Base64加密的字符串中。 如果要更改字节数组的生成和读取方式,则必须创建自己的以下接口实现:

  • org.kie.api.marshalling.Marshaller进行知识讲座
  • 流程实例的org.jbpm.marshalling.impl.ProcessInstanceMarshaller

但是提供一个示例可能会花费大量时间,甚至可能需要整本书来解释,因此我们将跳过。

步骤2:实现PersistenceContext

在某些情况下,重新定义PersistenceContext和PersistenceContextManager就足以实现您的所有持久性要求。 PersistenceContext是一个对象,负责实现工作项和会话对象的持久化,方法是实现持久化工作项和会话对象的方法,并通过ID查询它们并将它们从特定的存储实现中删除。 PersistenceContextManager负责为所有应用程序创建一次或在每个命令的基础上创建PersistenceContext。 comand服务将在需要时使用它来持久化会话及其对象。

在我们的案例中,我们使用Infinispan缓存作为存储实现了PersistenceContext和PersistenceContextManager。 不同的PersistenceContextManager实例将可以通过Environment变量访问所有配置对象。 我们已经使用Environment中已定义的键来存储Infinispan相关的对象:

  • EnvironmentName.ENTITY_MANAGER_FACTORY用于存储基于Infinispan的CacheManager
  • EnvironmentName.APP_SCOPED_ENTITY_MANAGER和EnvironmentName.CMD_SCOPED_ENTITY_MANAGER将指向Infinispan缓存对象。

您可以在这里看到该代码:

在这一点上,我们有一些非常重要的步骤来重新定义我们的流口水持久性。 现在,我们需要知道如何配置我们的知识会议以使用此组件。

步骤3:为我们的工作项目,流程实例和信号创建经理

现在我们有了持久性上下文,我们需要教会会议如何正确使用它们。 知识会话具有一些可以配置的管理器,这些管理器使您可以修改或更改默认行为。 这些经理是:

  • org.kie.api.runtime.process.WorkItemManager :它管理工作项目的执行时间,将其与适当的处理程序连接,并在工作项目完成时通知流程实例。
  • org.jbpm.process.instance.event.SignalManager :它管理何时向进程发送信号或从进程发送信号。 由于流程实例可能被钝化,因此需要
  • org.jbpm.process.instance.ProcessInstanceManager :它管理在创建,启动,修改或完成流程实例时要采取的动作。

这些接口的JPA实现已经可以与持久性上下文管理器一起使用,因此大多数时候您不需要扩展它们。 但是,与Infinispan相比,我们必须确保流程实例的持久性要比JPA多,因此我们必须以不同的方式实现它们。

一旦有了这些实例,就需要为每种类型的管理器创建一个工厂。接口名称相同,但后缀“ Factory”除外。 每个用户都接收一个知识会话作为参数,从中可以获取环境对象和所有其他配置。

步骤4:配置知识会话

现在我们已经创建了不同的经理,我们将需要告诉我们的知识会议以使用它们。 为此,您需要使用SingleSessionCommandService实例创建一个CommandBasedStatefulKnowledgeSession实例。 顾名思义,SingleSessionCommandService是一个用于一次针对一个会话执行命令的类。 SingleSessionCommandService的构造函数接收创建适当会话并对其执行持久化方式所需的所有参数。 这些参数是:

  • KieBase :具有用于会话运行时的知识定义的知识库。
  • KieSessionConfiguration :我们在其中配置管理器工厂以创建和处理工作项,流程实例和信号。
  • 环境 :用于其他目的的一袋变量,我们将在其中配置持久性上下文管理器对象。
  • sessionId(可选) :如果存在,则此参数在存储中查找已存在的会话。 否则,它将创建一个新的。

同样,在我们的示例中,我们使用的是Infinispan,它不是基于引用的存储,而是基于值的存储。 这意味着一旦您对infinispan说要存储一个值,它将存储它的一个副本而不是实际对象。 流口水持久性中的某些内容通过基于引用的存储进行管理,这意味着您可以告诉框架持久化对象,更改其属性,并在提交事务后查看存储在数据库中的那些更改。 使用infinispan不会发生这种情况,因此您必须在命令执行完成后实现对缓存值的更新。 对我们来说幸运的是,SingleSessionCommandService允许我们通过实现拦截器来做到这一点。

拦截器基本上是您自己的命令服务,用于包装默认命令。 您可以告诉每个命令在每次执行之前或之后添加更多行为。 这里有一些图表来解释它是如何工作的:

如您所见,SingleSessionCommandService允许命令服务实例实际调用命令的execute方法。 并且由于命令服务的拦截器扩展,我们可以在链中添加任意数量的内容,从而使我们可以在每次需要执行命令时执行下一个序列图之类的内容:

在我们的例子中,我们创建了几个拦截器,并将它们添加到SingleSessionCommandService中。 确保在完成命令后存储对会话对象所做的所有更改。 另一个允许我们对流程实例对象执行相同的操作。

总的来说,这是我们现在需要创建知识会话以实际使用infinispan作为持久性方案的方式:

复杂吧? 不用担心 还有另外两类可以简化配置。

步骤4:创建我们自己的启动服务

是的,每次我们想要创建自己的自定义持久性知识会话时,我们都可以编写大量代码。 这是一个自由的世界(大部分情况下)。 但是,您也可以将此实现包装在带有两个公开方法的单个类中:

  • 一个创建新的会话
  • 一个加载先前存在的会话

并在内部创建所有配置,并在需要更改一项或多项更改时将其合并。 Drools提供了一个接口来充当此协议的接口,称为org.kie.api.persistence.jpa.KieStoreServices

我们创建了此接口的自己实现,并且还创建了一个静态类(称为InfinispanKnowledgeService)来访问该接口。 这使我们能够创建如下会话:

结论

流口水的持久性似乎很难理解和工作,更不用说以自己的方式实现它了。 但是,我希望这对那些需要以特殊方式实现流口水持久性,或者甚至想知道是否可以通过JPA以外的其他方式实现流口水持久性的人有点神秘。

另外,如果您希望看到为使其工作而进行的修改,请参见以下三个请求请求:

  • https://github.com/droolsjbpm/droolsjbpm-build-bootstrap/pull/38
  • https://github.com/droolsjbpm/drools/pull/198
  • https://github.com/droolsjbpm/jbpm/pull/166

在此JIRA票证中指定了向Drools添加此功能的功能请求。 如果您希望将其作为核心drools项目的一部分,可以随时对其进行投票!

参考: Drools&jBPM博客上的JCG合作伙伴 Geoffrey De Smet 借助Infinispan创建了自己的Drools和jBPM Persistence 。

翻译自: https://www.javacodegeeks.com/2013/05/creating-your-own-drools-and-jbpm-persistence-with-infinispan.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Html5 填表 表单(二) input type 各种输入, 各种用户选择,上传等等泛输入用户交互

<input> 无限制输入 type 限制输入 type 如下类型 type 后还可以跟一些属性: 如<input typetext maxlength 10> 限制文本的长度为10字节 list 可以用的时候再来查, list就是当一个建议值不够的时候添加到几个. <form> <input typ…

c语言 输出音频 单片机,单片机播放WAV格式音频的理解

CSDN账号注册了3年&#xff0c;一直没有上来过&#xff0c;更不用说写博客了。我不知道博客的具体用途&#xff0c;我只想把它当做一种心得来发表&#xff0c;可能是一些技术上的理解或者生活上的小故事。好了&#xff0c;下面我将记录我对WAV播放器的理解。很久以前就看到过某…

UVALive3989 Ladies' Choice —— 稳定婚姻问题 Gale - Shapely算法

题目链接&#xff1a;https://vjudge.net/problem/UVALive-3989 题解&#xff1a; 题意&#xff1a;有n个男生和n个女生。每个女生对男神都有个好感度排行&#xff0c;同时每个男生对每个女生也有一个好感度排行。问&#xff1a;怎样配对&#xff0c;才能使的每个女生尽可能幸福…

通过命令行界面使用AWS ElasticMapReduce

在本文中&#xff0c;我将通过针对EMR的CLI使用AWS MapReduce服务&#xff08;称为ElasticMapReduce &#xff09;。 使用EMR的过程可以大致分为三个步骤&#xff1a; 设置并填充S3存储桶 创建并运行EMR作业 从S3存储桶中获取结果 在开始这三个高级步骤之前&#xff0c;还…

[UE4]关卡蓝图

转载于:https://www.cnblogs.com/timy/p/9053876.html

iframe的缺点

一、iframe会阻塞主页面的onload事件&#xff1b; 二、搜索引擎检索程序无法解读这种页面&#xff0c;不利于SEO&#xff1b; 三、会影响页面的并行加载。 并行加载&#xff1a;同一时间对同一域名下的加载数量是有限制的&#xff1a; 解决方法&#xff1a; 使用js动态给ifr…

使用可视化工具redisclient连接redis

可视化工具推荐&#xff1a;http://database.51cto.com/art/201505/477692.htm 1.连接redis服务端 1.1 设置连接密码&#xff1a;在redis根目录下&#xff0c;双击redis-cli.exe&#xff0c; 输入命令&#xff1a;redis-cli.exe -h 127.0.0.1 -p 6379 -n 1 1就是密码 1.2 使…

android 蓝牙项目代码,Android蓝牙聊天开源项目

前言基于Android Classic Bluetooth的蓝牙聊天软件&#xff0c;目前仅支持一对一实时通信、文件传输、好友添加、好友分组、好友在线状态更新等功能&#xff0c;其中消息发送支持文本、表情等方式。前景蓝牙技术作为一种小范围无线连接技术&#xff0c;能够在设备间实现方便快捷…

你必须知道的.NET之特性和属性(转)

你必须知道的.NET之特性和属性2008-10-13 来源&#xff1a;网络 1. 引言 attribute是.NET框架引入的有一技术亮点&#xff0c;因此我们有必要花点时间走进一个发现attribute登堂入室的入口。因为.NET Framework中使用了大量的定制特性来完成代码约定&#xff0c;[Serializable]…

宽带阻抗匹配的工程实现-第一步,端口驻波仿真

概要 ADS仿真&#xff0c;Matlab仿真&#xff0c;宽带阻抗匹配&#xff0c;smith圆图。 其实阻抗匹配我工作以来经常说&#xff0c;也经常做&#xff0c;但是基本上都是直接在印制板上进行调试。现在想先用仿真软件直接设计出来&#xff0c;才发现很多东西嘴上说容易&#xf…

学web前端一定要这样学,不然学完找不到工作哭都来不及!

因为工作原因&#xff0c;经常关注有关互联网行业的最新动态。这不&#xff0c;刚送走了高考&#xff0c;又迎来了每年的毕业季&#xff0c;看到好多人都说今年的前端工作不好找&#xff0c;很多童鞋简历投了一大堆&#xff0c;也没有回应&#xff0c;发现连实习的机会都没有&a…

android视频通信和web端,探讨用webrtc在手机和浏览器之间实现音视频实时通信的实施环境...

探讨用webrtc在手机和浏览器之间实现音视频实时通信的实施环境Walker.Xuproduct/develop flow&#xff1a;技术需求&#xff1a;任务拆解:1.android客户端2.前端js网页客户端技术产品&#xff1a;落地&#xff0c;实施在实际应用环境中1.技术因素2.非技术因素选择浏览器的标准&…

XStream – XStreamely使用Java中的XML数据的简便方法

有时候&#xff0c;我们不得不处理XML数据。 而且大多数时候&#xff0c;这不是我们一生中最快乐的一天。 甚至有一个术语“ XML地狱”描述了程序员必须处理许多难以理解的XML配置文件时的情况。 但是&#xff0c;不管喜欢与否&#xff0c;有时我们别无选择&#xff0c;这主要是…

前端微信小程序实战篇

电商底部导航栏的制作 我想大家对电商一定不陌生&#xff0c;一般电商的底部导航栏有以下几个首页、分类、购物车、个人中心。 app.json是用来配置page路径以及导航栏属性的&#xff0c;那我们要做首页、分类、购物车、个人中心界面就要在page也添加这几个界面&#xff0c;所…

Spring MVC –使用@ResponseBody轻松实现基于REST的JSON服务

Spring 3使JSON REST服务非常容易。 本教程将通过几个步骤向您展示如何进行。 您可以在GitHub上获取代码。 先决条件 您应该有一个运行中的Spring MVC应用程序。 如果尚未设置正常的Spring MVC应用程序&#xff0c;请按照本教程进行操作 。 我们将定义三个REST服务&#xff1a…

(转)zabbix3.4使用percona-monitoring-plugins监控mysql

原文&#xff1a;https://blog.csdn.net/yanggd1987/article/details/79656771 简介 之前主要使用nagios监控mysql&#xff0c;本文主要介绍使用percona-monitoring-plugins监控mysql&#xff0c;percona监控插件是php开发&#xff0c;因此要在agent安装php环境。 配置安装 一.…

html基础-html简介-第一个网页(1)

今天刚刚开通博客园&#xff0c;把我最近整理的html/css来说一下&#xff0c;对于初学者还是有一定的帮助。 一、先来为大家简单普及以下html &#xff08;1&#xff09;、html英文即&#xff1a;hypertext markup language 中译 &#xff1a; 超文本标记语言 &#xff08;2&…

javafx android sdk,JavaFX打包到Android上

让JavaFX运行到移动平台一直是社区努力完成的事。当然&#xff0c;目前已经可以让JavaFX运行到Android和IOS平台了&#xff0c;下面我们来看看如何打包自己的JavaFX项目到Android平台。这个示例是我从打包官方示例的例子里修改而来&#xff0c;用于打包一个简单的JavaFX程序。示…

在zookeeper集群的基础上,搭建伪solrCloud集群

伪集群的搭建&#xff1a;将solrCloud搭建到同一台机器上。 准备工作 1 将在window中部署的单机版solr上传到服务器&#xff08;虚拟机&#xff09;中 solr的简单部署&#xff1a;在tomcat中启动slor 的内容 这一次放到 mkdir /usr/local/solr-cloud 文件夹内并解压 2 复制4份…

css类选择器类名覆盖优先级

code <style>.a{background: red;}.b{background: yellow;} </style> <div class"a b">A</div> 渲染效果 最初以为更改元素中class类里面的类名顺序&#xff0c;渲染效果就会根据类名顺序依次渲染code <style>.a{background: red;…