繁体   English   中英

使用持久性进行Drools状态知识会议

[英]Drools Stateful Knowledge Session using persistence

我正在按照JBPM持久性文档中的说明创建Drools状态会话: 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();

我正在将EclipseLink持久性提供程序与MySQL JDBC驱动程序一起使用。

最后,我使它工作了。 我犯的最重要的错误是我试图将EclipseLink用作JPA提供程序。 该方法行不通,因为除了自定义持久性类之外,Drools还使用其他两个org.drools.persistence.info.SessionInfo持久性注释的类: org.drools.persistence.info.SessionInfoorg.drools.persistence.info.WorkItemInfo 这两个包含日期字段,这些字段未使用JPA Temporal注释进行注释。 它们似乎是专门为Hibernate量身定制的。

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

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

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

但是,我上面提到的异常是由于即使在persistence.xml中明确指定了JTA,EclipseLink仍在创建“ ResourceLocal”事务包装器。 这是由于没有指定目标服务器属性。 因此,创建的数据库会话没有附加外部事务控制器,并且提供的包装程序根本不支持joinTransaction操作。 要变通解决此问题,将以下行添加到您的persistence.xml文件:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM