【问题标题】:How to setup jBPM in a desktop application?如何在桌面应用程序中设置 jBPM?
【发布时间】:2015-07-30 05:47:51
【问题描述】:

我想要什么:

我正在创建一个应该读取 bpmn2 文件并列出其所有任务的原型。

我正在使用什么:

目前我有一个使用 jBPM 6 的简单 Maven 应用程序。我不需要任何应用程序服务器、工作台等,因为它只是一个简单的桌面应用程序。

问题:

如果我这样初始化引擎 (as suggested by the official documentation):

RuntimeEnvironment environment = 
                RuntimeEnvironmentBuilder.Factory.get()
                .newDefaultInMemoryBuilder()
                .persistence(false)
                .addAsset(ResourceFactory.newClassPathResource("poc4.bpmn2"), ResourceType.BPMN2)
                .get();

我收到此错误:

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named org.jbpm.persistence.jpa
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:69)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
    at org.jbpm.runtime.manager.impl.DefaultRuntimeEnvironment.init(DefaultRuntimeEnvironment.java:72)
    at org.jbpm.runtime.manager.impl.RuntimeEnvironmentBuilder.get(RuntimeEnvironmentBuilder.java:314)
    at org.jbpm.runtime.manager.impl.RuntimeEnvironmentBuilder.get(RuntimeEnvironmentBuilder.java:56)
    at com.test.jbpmpoc.main(App.java:11)

请注意,我正在尝试在显式禁用持久性的情况下启动引擎,但我认为这不是必需的,因为文档说the engine does NOT use persistence by default

我知道的:

根据我的研究,至少有两种初始化引擎的方法。

  1. 使用提供运行时环境的构建器 - 我已经在这样做了。这似乎是the most recommended way of doing it,因为默认情况下会初始化所有服务。但是,正如herehere 所说,如果您想使用Tasks(这是我做的),此方法需要设置持久性;

  2. 手动初始化所​​有内容。我不太喜欢这个,因为运行一个简单的应用程序听起来太费劲了。

  3. 使用其他运行时环境构建器。

我尝试过的:

一开始,我尝试使用persistence.xml suggested by the documentation,但在创建EntityManagerFactory 时出现不同的错误:

Exception in thread "main" javax.persistence.PersistenceException: Unable to build entity manager factory
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:83)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)
    at com.test.jbpmpoc.App.main(App.java:30)
Caused by: org.hibernate.engine.jndi.JndiException: Error parsing JNDI name [jdbc/jbpm-ds]
    at org.hibernate.engine.jndi.internal.JndiServiceImpl.parseName(JndiServiceImpl.java:141)
    at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:112)
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:115)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1887)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1845)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
    ... 3 more
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
    at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
    at javax.naming.InitialContext.getNameParser(Unknown Source)
    at org.hibernate.engine.jndi.internal.JndiServiceImpl.parseName(JndiServiceImpl.java:135)
    ... 20 more

我没有使用应用程序服务器,也没有 JTA 数据源和 ORM 文件,因此我注释了指向这些文件的行以修复此 JNDI 错误,然后我得到了另一个异常:

Exception in thread "main" java.lang.NoSuchMethodError: javax.persistence.NamedQuery.lockMode()Ljavax/persistence/LockModeType;
    at org.hibernate.cfg.annotations.QueryHintDefinition.determineLockOptions(QueryHintDefinition.java:138)
    at org.hibernate.cfg.annotations.QueryBinder.bindQuery(QueryBinder.java:72)
    at org.hibernate.cfg.annotations.QueryBinder.bindQueries(QueryBinder.java:219)
    at org.hibernate.cfg.AnnotationBinder.bindQueries(AnnotationBinder.java:374)
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:618)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3845)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3799)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1412)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)
    at com.test.jbpmpoc.App.main(App.java:30)

我很确定我离这里越来越近了。如果我在应用程序服务器之外运行,我真的需要 JTA 数据源和 ORM 文件吗? jBPM 安装程序不附带这些,我在哪里可以找到它们?

我还尝试使用空构建器而不是默认构建器之一,因此我需要手动初始化所​​有内容,包括 TaskService,如果我想管理任务(列表、执行, 等等)。但是,它也需要persistence.xml,因为我不断收到No Persistence provider 消息。

编辑

我早该猜到 NoSuchMethodError 异常是由错误版本的 Maven 工件引起的。我还在持久性定义中将 JTA 作为我的事务策略,但没有提供任何 jta 数据源。但是,现在我已经更改了我的 pom.xml 和 persistence.xml,我收到了这个错误:

Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: org.jbpm.persistence.jpa] Unable to build EntityManagerFactory
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:900)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
    at com.test.jbpmpoc.App.main(App.java:30)
Caused by: org.hibernate.HibernateException: Errors in named queries: GetProcessInstanceIdByCorrelation
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:435)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:891)
    ... 4 more

似乎来自JBPMorm.xml 文件的命名查询之一是错误的。我从JBPM source code 复制了这个文件。

关于我的 Java 项目的更多信息:

我找到的所有示例和教程都专注于创建在应用程序服务器上运行的 Web 应用程序,但在我的情况下,缺少应用程序服务器需要我还没有找到的解决方法。 有人设法使用 jBPM 6 运行简单的桌面应用程序吗?

【问题讨论】:

    标签: java persistence desktop-application jbpm


    【解决方案1】:

    我可能不会直接回答你的问题,但我觉得下面的答案可以指导你解决问题。

    我从这个问题的推断是,基本上在这里我们希望以编程方式(没有像数据库这样的外部依赖项)创建 jBPM 运行时并对其进行操作。

    我建议您阅读用户指南 - 第 6.8 节。测试,可帮助您测试流程,您可以测试流程在特定用例中的行为是否符合预期,

    http://docs.jboss.org/jbpm/v6.2/userguide/jBPMBPMN2.html#d0e4026

    文档建议您扩展 JbpmJUnitBaseTestCase 并创建 junit 测试用例。 JbpmJUnitBaseTestCase 类将逻辑抽象为 createRuntimeManager、assertProcessInstanceCompleted 等...您可以参考或重用该类来构建您的应用程序。

    https://github.com/droolsjbpm/jbpm/blob/master/jbpm-test/src/main/java/org/jbpm/test/JbpmJUnitBaseTestCase.java

    【讨论】:

    • 感谢您的回复。其实我以前也试过这个,但是在调用createRuntimeManager("poc4.bpmn2"); 时我仍然得到java.lang.NoSuchMethodError: javax.persistence.NamedQuery.lockMode()Ljavax/persistence/LockModeType; 异常。为了摆脱它,我可以在禁用持久性的情况下调用超类构造函数,但是我将无法使用任务服务。
    猜你喜欢
    • 2015-03-14
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多