当前位置: 首页 > news >正文

电子商务网站建设与管理课程心得怀化优化办

电子商务网站建设与管理课程心得,怀化优化办,深圳企业网站推广,电子工程网介绍我 在这里发表的原始文章#xff1a; 您好#xff0c;欢迎来到我打算向您展示如何创建自己的Drools和jBPM持久性实现的帖子。 我已经为流口水对象开发了基于infinispan的持久性方案#xff0c;并且在此过程中学到了很多东西。 如果您想做某种事情#xff0c;我打算给您一些… 我 在这里发表的原始文章 您好欢迎来到我打算向您展示如何创建自己的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项目的一部分可以随时对其进行投票 参考 DroolsjBPM博客上的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.huolong8.cn/news/91757/

相关文章:

  • 网站模板 餐饮路由器当服务器做网站
  • 临沂网站临沂网站制作页面设计结课总结
  • 网站建设在哪学千锋教育西安校区
  • 确定网站建设目标福州最好的网站设计服务公司
  • 郑州网站建设平台山东网架公司
  • 义乌营销型网站建设中国建设集团官网
  • 广州手机网站建设如保做网站赢利
  • 网站你懂我意思正能量免费软件临沂网站制作计划
  • 微信注册网站wordpress彩色标签云
  • 英文电商网站建设seo快速排名软件价格
  • 找到做网站的公司东莞常平做网站公司
  • 某旅行社网站建设论文网站ftp地址查询
  • 地产网站建设案例上海关键词排名提升
  • 安徽网站设计定制丽水做企业网站的公司
  • 厦门电商网站开发linux建设php网站
  • 网站维护是什么做下载网站有哪些
  • 龙港 网站建设实用又有创意的产品设计
  • 刚做的网站怎么才能搜到我泉州建站模板系统
  • 在家做兼职官方网站平台百度官网登录入口
  • 阿里云服务器怎么发布网站自己制作动漫的软件
  • 企业网站禁忌制作微信小程序公司
  • 域名服务商怎么查询网站推广优化外包便宜
  • 大庆建设网站互联网网站名字
  • ppt模版模板免费网站互联网app推广
  • 怎么seo网站推广网上哪些网站可以做兼职
  • 郑州网站建设的公司哪家好多少钱网站建设
  • 四川学校网站建设公大型网站服务器价格
  • 石头科技 网站开发网站广告psd
  • 网页制作与网站建设 在线作业交换友情链接的意义是什么
  • 网站建设需要什么硬件和软件企业服饰网站模板