如何禁用JBPM持久性?

时间:2015-02-06 12:10:57

标签: java persistence jbpm

我试图用JBPM 6实现一些测试。我目前正在使用一个简单的hello world bpmn2文件,该文件已正确加载。

我对文档( Click )的理解是默认情况下应该禁用持久性。 "默认情况下,如果您不配置流程引擎,则流程实例不会持久化。"

然而,当我尝试实现它,并且没有做任何特殊的事情来启用持久性时,每次我尝试做任何事情时都会遇到与持久性相关的问题。

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.jpa.EntityManagerFactoryManager.getOrCreate(EntityManagerFactoryManager.java:33)
    at org.jbpm.runtime.manager.impl.DefaultRuntimeEnvironment.init(DefaultRuntimeEnvironment.java:73)
    at org.jbpm.runtime.manager.impl.RuntimeEnvironmentBuilder.get(RuntimeEnvironmentBuilder.java:400)
    at org.jbpm.runtime.manager.impl.RuntimeEnvironmentBuilder.get(RuntimeEnvironmentBuilder.java:74)</blockquote>

我通过以下方式创建我的运行时环境,

RuntimeEnvironment environment = RuntimeEnvironmentBuilder.Factory.get()
            .newDefaultInMemoryBuilder()
            .persistence(false)
            .addAsset(ResourceFactory.newClassPathResource("examples/helloworld.bpmn2.xml"), ResourceType.BPMN2)
            .addAsset(ResourceFactory.newClassPathResource("examples/newBPMNProcess.bpmn"), ResourceType.BPMN2)
            .get();

正如我的理解是默认情况下应该禁用持久性,我不会看到我做错了什么。它可能与某些依赖项中包含的内容相关联,但我也没有找到任何内容。

是否有人已经面临同样的问题或有任何建议。

由于

2 个答案:

答案 0 :(得分:1)

RuntimeManager是流程引擎和人工任务服务的组合。人工任务服务需要持久性(启动人工任务等),这就是为什么它仍然要求数据源,即使你将引擎配置为不使用持久性。

如果你想在没有人工任务服务的情况下使用引擎,你根本不需要持久性,但在这种情况下我不会使用RuntimeManager,只需直接从kbase创建一个ksession: http://docs.jboss.org/jbpm/v6.1/userguide/jBPMCoreEngine.html#d0e1805

答案 1 :(得分:0)

你在代码中使用的InMemoryBuilder应该(根据API文档)不是持久的,但它实际上是在环境中添加一个持久性管理器,只是使用InMemoryMapper而不是JPAMapper,因为init的方式DefaultRuntimeEnvironment中的()方法已实现:

public void init() {
    if (emf == null && getEnvironmentTemplate().get(EnvironmentName.CMD_SCOPED_ENTITY_MANAGER) == null) {
        emf = EntityManagerFactoryManager.get().getOrCreate("org.jbpm.persistence.jpa");
    }   
    addToEnvironment(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
    if (this.mapper == null) {
        if (this.usePersistence) {
            this.mapper = new JPAMapper(emf);
        } else {
            this.mapper = new InMemoryMapper();
        }
    }
}

正如您在上面所看到的,这仍然尝试将getOrCreate()作为持久性单元(我已经看到了一个更好的实现,它也检查了某处持久性属性的值,但问题是,DefaultRuntimeEnvironment不这样做)

你需要在没有持久性的情况下离开是一个newEmptyBuilder():

RuntimeEnvironment env = RuntimeEnvironmentBuilder.Factory.get()
            .newEmptyBuilder()
            .knowledgeBase(KieServices.Factory.get().getKieClasspathContainer().getKieBase("my-knowledge-base"))
            // ONLY REQUIRED FOR PER-REQUEST AND PER-INSTANCE STRATEGY
            //.addEnvironmentEntry("IS_JTA_TRANSACTION", false)
            .persistence(false)
            .get();

请注意,这只适用于Singleton运行时管理器 - PerProcessInstance和PerRequest希望能够在必要时暂停正在运行的事务,这只有在实体管理器能够保持状态时才有可能。

使用这两种策略进行测试时,也可以使用上面的addEnvironmentEntry()。