【问题标题】:Error while creating JBPM knowledgesession创建 JBPM 知识会话时出错
【发布时间】:2023-11-17 21:53:01
【问题描述】:

我正在将 oracle 数据库与 jbpm 5.4 集成,而不是使用它自己的 h2 数据库。创建 KnowledgeSession 时,它会生成错误,因为“必须在 ConnectionDriverName 属性中指定 JDBC 驱动程序或数据源类名”。我希望我已经在persistence.xml 中指定了驱动程序类名。问题详情如下。
有人可以帮我理解和解决问题吗?

jbpm 5.4
日食 juno sr1
websphere 7
甲骨文 10g

知识会话创建代码:

EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.jbpm.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
System.out.println(emf);
System.out.println(EnvironmentName.ENTITY_MANAGER_FACTORY);
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
env.set( EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager() );
env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );

Properties properties = new Properties();
properties.put("drools.processInstanceManagerFactory", "org.jbpm.persistence.processinstance.JPAProcessInstanceManagerFactory");
properties.put("drools.processSignalManagerFactory", "org.jbpm.persistence.processinstance.JPASignalManagerFactory");
KnowledgeSessionConfiguration config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(properties);
System.out.println("config ** "+config);
System.out.println("kbase ** "+kbase);
System.out.println("env ** "+env);
System.out.println("env transaction manager: "+env.get("drools.transaction.TransactionManager"));
StatefulKnowledgeSession newStatefulKnowledgeSession = JPAKnowledgeService.newStatefulKnowledgeSession(kbase,config,env);

return newStatefulKnowledgeSession;

persistence.xml:

<persistence-unit name="org.jbpm.persistence.jpa" transaction-type="JTA">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>

<jta-data-source>jdbc/jbpmDS</jta-data-source>

<class>org.drools.persistence.info.SessionInfo</class>
<class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>
<class>org.jbpm.persistence.processinstance.ProcessInstanceEventInfo</class>
<class>org.drools.persistence.info.WorkItemInfo</class>
<class>org.jbpm.process.audit.ProcessInstanceLog</class>
<class>org.jbpm.process.audit.NodeInstanceLog</class>
<class>org.jbpm.process.audit.VariableInstanceLog</class>      
<class>org.jbpm.task.Task</class>
<class>org.jbpm.task.Comment</class>
<class>org.jbpm.task.Attachment</class>
<class>org.jbpm.task.I18NText</class>
<class>org.jbpm.task.SubTasksStrategy</class>
<class>org.jbpm.task.Deadline</class>
<class>org.jbpm.task.Escalation</class>
<class>org.jbpm.task.Reassignment</class>
<class>org.jbpm.task.Notification</class>
<class>org.jbpm.task.BooleanExpression</class>
<class>org.jbpm.task.User</class>
<class>org.jbpm.task.PeopleAssignments</class>

<properties>   
    <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/>
    <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="hibernate.connection.url" value="jdbc:oracle:thin:@131.131.131.131:1521:abcd" />
    <property name="hibernate.connection.username" value="abcdef"/>
    <property name="hibernate.connection.password" value="abcdef"/>    
    <property name="hibernate.connection.autocommit" value="false"/>
    <property name="hibernate.max_fetch_depth" value="3"/>
    <property name="hibernate.hbm2ddl.auto" value="update" />
    <property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>

<persistence-unit name="org.jbpm.task">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>       

<class>org.jbpm.task.Attachment</class>
<class>org.jbpm.task.Content</class>
<class>org.jbpm.task.BooleanExpression</class>
<class>org.jbpm.task.Comment</class>
<class>org.jbpm.task.Deadline</class>
<class>org.jbpm.task.Comment</class>
<class>org.jbpm.task.Deadline</class>
<class>org.jbpm.task.Delegation</class>
<class>org.jbpm.task.Escalation</class>
<class>org.jbpm.task.Group</class>
<class>org.jbpm.task.I18NText</class>
<class>org.jbpm.task.Notification</class>
<class>org.jbpm.task.EmailNotification</class>
<class>org.jbpm.task.EmailNotificationHeader</class>
<class>org.jbpm.task.PeopleAssignments</class>
<class>org.jbpm.task.Reassignment</class>
<class>org.jbpm.task.Status</class>
<class>org.jbpm.task.Task</class>
<class>org.jbpm.task.TaskData</class>
<class>org.jbpm.task.SubTasksStrategy</class>
<class>org.jbpm.task.OnParentAbortAllSubTasksEndStrategy</class>
<class>org.jbpm.task.OnAllSubTasksEndParentEndStrategy</class>
<class>org.jbpm.task.User</class>
<class>org.drools.persistence.info.SessionInfo</class>
<class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>
<class>org.jbpm.persistence.processinstance.ProcessInstanceEventInfo</class>
<class>org.drools.persistence.info.WorkItemInfo</class>

<properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/>
    <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="hibernate.connection.url" value="jdbc:oracle:thin:@131.131.131.131:1521:abcd" />
    <property name="hibernate.connection.username" value="abcdef"/>
    <property name="hibernate.connection.password" value="abcdef"/>    
    <property name="hibernate.connection.autocommit" value="false"/>
    <property name="hibernate.max_fetch_depth" value="3"/>
    <property name="hibernate.hbm2ddl.auto" value="update" />
    <property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>

错误日志:

SystemOut     O com.ibm.ws.persistence.EntityManagerFactoryImpl@3fb23fb2
SystemOut     O drools.persistence.jpa.EntityManagerFactory
SystemOut     O config ** org.drools.SessionConfiguration@665f665f
SystemOut     O kbase ** org.drools.impl.KnowledgeBaseImpl@48df48df
SystemOut     O env ** org.drools.impl.EnvironmentImpl@4b4b4b4b
SystemOut     O env transaction manager: a BitronixTransactionManager with 0 in-flight transaction(s)
SystemOut     O 11  org.jbpm.persistence.jpa  INFO   [WebContainer : 0] openjpa.Runtime - Starting OpenJPA 1.2.3-SNAPSHOT
SystemErr     R java.lang.IllegalStateException: java.lang.reflect.InvocationTargetException
SystemErr     R             at org.drools.persistence.jpa.KnowledgeStoreServiceImpl.buildCommandService(KnowledgeStoreServiceImpl.java:142)
SystemErr     R             at org.drools.persistence.jpa.KnowledgeStoreServiceImpl.newStatefulKnowledgeSession(KnowledgeStoreServiceImpl.java:66)
SystemErr     R             at org.drools.persistence.jpa.JPAKnowledgeService.newStatefulKnowledgeSession(JPAKnowledgeService.java:122)
SystemErr     R             at com.sample.execute.MigrateDB.createKnowledgeSession(MigrateDB.java:99)
SystemErr     R             at com.sample.execute.MigrateDB.dbMIgration(MigrateDB.java:42)
SystemErr     R             at com.servlets.AServlet.doPost(AServlet.java:41)
SystemErr     R             at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)
SystemErr     R             at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
SystemErr     R             at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657)
SystemErr     R             at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:939)
SystemErr     R             at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502)
SystemErr     R             at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:179)
SystemErr     R             at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3935)
SystemErr     R             at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:276)
SystemErr     R             at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:931)
SystemErr     R             at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1583)
SystemErr     R             at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:186)
SystemErr     R             at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452)
SystemErr     R             at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511)
SystemErr     R             at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)
SystemErr     R             at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)
SystemErr     R             at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
SystemErr     R             at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
SystemErr     R             at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
SystemErr     R             at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
SystemErr     R             at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
SystemErr     R             at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
SystemErr     R             at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
SystemErr     R             at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1604)
SystemErr     R Caused by: java.lang.reflect.InvocationTargetException
SystemErr     R             at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
SystemErr     R             at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:45)
SystemErr     R             at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:39)
SystemErr     R             at java.lang.reflect.Constructor.newInstance(Constructor.java:515)
SystemErr     R             at org.drools.persistence.jpa.KnowledgeStoreServiceImpl.buildCommandService(KnowledgeStoreServiceImpl.java:128)
SystemErr     R             ... 28 more
SystemErr     R Caused by: <openjpa-1.2.3-SNAPSHOT-r422266:1152904 fatal user error> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.
SystemErr     R             at org.apache.openjpa.jdbc.schema.DataSourceFactory.newDataSource(DataSourceFactory.java:74)
SystemErr     R             at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.createConnectionFactory(JDBCConfigurationImpl.java:784)
SystemErr     R             at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getDBDictionaryInstance(JDBCConfigurationImpl.java:561)
SystemErr     R             at org.apache.openjpa.jdbc.meta.MappingRepository.endConfiguration(MappingRepository.java:1344)
SystemErr     R             at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:505)
SystemErr     R             at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:430)
SystemErr     R             at org.apache.openjpa.lib.conf.PluginValue.instantiate(PluginValue.java:103)
SystemErr     R             at org.apache.openjpa.conf.MetaDataRepositoryValue.instantiate(MetaDataRepositoryValue.java:68)
SystemErr     R             at org.apache.openjpa.lib.conf.ObjectValue.instantiate(ObjectValue.java:83)
SystemErr     R             at org.apache.openjpa.conf.OpenJPAConfigurationImpl.newMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:863)
SystemErr     R             at org.apache.openjpa.conf.OpenJPAConfigurationImpl.getMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:854)
SystemErr     R             at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:638)
SystemErr     R             at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:183)
SystemErr     R             at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:142)
SystemErr     R             at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:192)
SystemErr     R             at com.ibm.ws.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:42)
SystemErr     R             at com.ibm.ws.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:27)
SystemErr     R             at org.drools.persistence.jpa.JpaPersistenceContextManager.getApplicationScopedPersistenceContext(JpaPersistenceContextManager.java:55)
SystemErr     R             at org.drools.persistence.SingleSessionCommandService.<init>(SingleSessionCommandService.java:144)
SystemErr     R             ... 33 more

【问题讨论】:

    标签: java oracle hibernate openjpa jbpm


    【解决方案1】:

    我认为您不想使用“纯”JPA 配置。

    快速浏览一下 JBoss 文档,demo tutorial 中的 3.7.3 和 3.7.4 似乎有有用的详细信息。

    如果我个人使用 OpenJPA 配置 Oracle,我会使用以下属性来标识我的 JNDI 资源:

    <jta-data-source>MyJNDIForXA</jta-data-source>
    <non-jta-data-source>MyOtherJNDI</non-jta-data-source>
    

    更重要的是,在documentation 中搜索“Oracle”并查看已知问题、示例等。例如,您可能需要配置 openjpa.jdbc.Schema 等属性。

    【讨论】:

      【解决方案2】:
      I think you need to change `persistence-unit` properties in `persistence.xml` .
      
      You are using `openJPA` as provider but in properties you are using `hibernate` .
      
      you can use below hibernate properties with provider as hibernate OR change properties for opnJPA as you are using.
      
          <provider>org.hibernate.ejb.HibernatePersistence</provider>
      
          <properties>
              <property name="hibernate.max_fetch_depth" value="3" />
              <property name="hibernate.hbm2ddl.auto" value="update" />
              <property name="hibernate.show_sql" value="false" />
              <property name="hibernate.transaction.manager_lookup_class"   value="org.hibernate.transaction.JBossTransactionManagerLookup" />
          <!--<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup" />  -->
              <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
          </properties>
      

      【讨论】:

      • 正是..所有这些属性在您的配置中都是“错误的” ...
      • @salaboy 你的意思是说 hibernate.dialect 配置错误。但是here 也是一样的,你能纠正几行来告诉我你想要的样子吗?