当前位置: 首页 > 知识库问答 >
问题:

Drools使用持久性的状态知识会话

柳才良
2023-03-14

我正在创建一个Drools有状态会话,如JBPM持久性文档中所述:http://docs.jboss.org/jbpm/v5.1/javadocs/org/drools/persistence/jpa/JPAKnowledgeService.html

但是,我遇到了以下异常

javax.persistence.TransactionRequiredException: joinTransaction has been called on a resource-local EntityManager which is unable to register for a JTA transaction.

我的代码是:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("metadata.model");
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
env.set(EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager());
env.set(EnvironmentName.TRANSACTION,   TransactionManagerServices.getTransactionManager());
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieBase kBase = kContainer.getKieBase();
StatefulKnowledgeSession kSession = JPAKnowledgeService.newStatefulKnowledgeSession(kBase, null, env);

在最后一行引发异常。在此之前,我已经绑定了上述文档中描述的JDBC JTA数据源。

PoolingDataSource ds = new PoolingDataSource();
ds.setUniqueName("jdbc/BitronixJTADataSource");
ds.setClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
ds.setMaxPoolSize(3);
ds.setAllowLocalTransactions(true);
ds.getDriverProperties().put("user", "root");
ds.getDriverProperties().put("password", "****");
ds.getDriverProperties().put("URL", "jdbc:mysql://localhost:3306/metadatadb");
ds.init();

我在MySQL JDBC驱动程序旁边使用Eclipse Link持久性提供程序。

共有1个答案

鲜于仰岳
2023-03-14

最后,我成功了。我犯的最重要的错误是,我试图使用EclipseLink作为JPA提供商。这种方法行不通,因为除了自定义持久性类之外,Drools还使用了另外两个带有持久性注释的类:org。流口水。坚持不懈信息。SessionInfo和组织。流口水。坚持不懈信息。WorkItemInfo。这两个包含未使用JPA时态注释进行注释的日期字段。它们似乎是专为冬眠而定制的。

我注意到的另一个重要方面是需要在设置环境变量后添加以下行:

env.set(EnvironmentName.OBJECT_MARSHALLING_STRATEGIES,
            new ObjectMarshallingStrategy[] {
                    new JPAPlaceholderResolverStrategy(domainEnv),
                    new SerializablePlaceholderResolverStrategy(
                            ClassObjectMarshallingStrategyAcceptor.DEFAULT) });

执行此操作是为了宣布您打算使用JPA保持当前会话状态。

然而,我上面提到的例外是,尽管在持久性中明确指定了JTA,但EclipseLink仍在创建“ResourceLocal”事务包装器。xml。这是因为没有指定目标服务器属性。因此,创建的数据库会话没有附加外部事务控制器,所提供的包装器根本不支持joinTransaction操作。要解决此问题,请在持久性中添加以下行。xml文件:

<property name="eclipselink.target-server" value="JBoss"/>

在初始化数据源之前,添加:

Configuration conf = TransactionManagerServices.getConfiguration();
conf.setJndiUserTransactionName("java:/TransactionManager");

当然,我假设BTM正在被使用。

 类似资料:
  • null null 如果进入房间的人是教师,则输入打印教师。 如果进入房间的人数超过30人,请通知我。 如果学生已上了超过20个小时的课,则更新状态为已完成。 现在我想要1和3组合在一起。 类似:4。如果有属性状态完成的学生进入教室,请通知老师。 现在,正如我前面所说的,这两个事件是分开的。所以在两个不同的规则中处理它更容易。但是当我想创建一个规则,它是规则4中1和3的组合,那么我必须验证一个进入

  • 需要一些帮助!!我对Drools中的有状态和无状态会话没有清晰的理解。我正在努力理解这一点,所以尝试了一个例子。 我在drools6.5版本上使用有状态和无状态会话测试了下面的drl,在这两种情况下都得到了相同的输出。根据我对无状态会话的理解,它应该只执行第一条规则,当应用程序对象在第一条规则中被修改时,第二条规则不应该被激活(“有效期”)。附加源代码。感谢您在这方面的帮助。

  • 问题内容: 从这里的讨论看来,Redux reducer的状态应该保留在数据库中。 用户身份验证在这种情况下如何工作? 是否不会创建新的状态对象来替换数据库中先前创建和编辑的每个用户(及其应用程序状态)的先前状态? 在前端使用所有这些数据并不断更新数据库中的状态是否会表现出色? 编辑: 我创建了一个示例Redux auth项目,该项目也恰好示例了通用Redux,并使用Redux,Socket.io

  • 我对口水还不熟悉。我试图理解Drools提供的无状态会话和有状态会话之间的区别。 根据我的初步理解, 在无状态会话的情况下,如果在任何规则的操作执行过程中修改了事实,则不会将其重新提交给推理引擎以找出与修改后的事实匹配的新规则。 在状态会话的情况下,如果在任何规则的操作执行过程中修改了事实,则它将被重新提交给推理引擎以找出与修改后的事实相匹配的新规则,然后执行相应的操作。 因此,当我试图通过编写一

  • 由于它来自官方的Drools文档,因此可以使用查询从无状态会话中获取结果。 在下面的示例中,Get People是一个drools查询,它基本上返回一个对象或一个无状态的对象列表(!)一场 在我的项目中,我需要获取在无状态Kie会话中创建的对象,因此我创建了一个查询: CustomerProfileResponse对象正在RHS中构造和创建: 我编写了以下代码来在批处理模式下执行命令,并查询得到的

  • 我们正在尝试使用Drool作为我们的规则引擎服务。我们到目前为止所做的如下 部署的工作台7.2.final 已部署的KIE服务器7.2.0。final 配置了一些数据对象、规则,将更改部署到KIE服务器,我们可以使用rest API执行规则 无状态会话满足了我们的大部分需求(给出一组数据,执行规则并返回数据,仅此而已)。但是使用无状态时,我们必须牺牲Drools有状态会话提供的许多重要特性。 我们