java - CdiJtaProcessEngineConfiguration 在加载事务管理器之前请求事务管理器

标签 java activiti apache-tomee

我成功地让 Activiti 与 JtaProcessEngineConfiguration 一起工作,并单独与 CdiStandaloneProcessEngineConfiguration 一起工作。

但是我无法让 CdiJtaProcessEngineConfiguration 工作,我的配置示例如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans <a href="http://www.springframework.org/schema/beans/spring-beans.xsd">

" rel="nofollow">http://www.springframework.org/schema/beans/spring-beans.xsd">

</a>    <bean id="transactionManager" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/TransactionManager"></property>
        <property name="resourceRef" value="true" />
    </bean>

    <bean id="processEngineConfiguration" class="org.activiti.cdi.CdiJtaProcessEngineConfiguration">
        <property name="transactionManager" ref="transactionManager" />
        <property name="transactionsExternallyManaged" value="true" />

        <property name="dataSourceJndiName" value="openejb:Resource/jdbc/AppDS" />
        <property name="databaseSchemaUpdate" value="false"/>

        <property name="jobExecutorActivate" value="false"/>
        <property name="asyncExecutorEnabled" value="true"/>
        <property name="asyncExecutorActivate" value="true"/>
        <property name="history" value="audit"/>
    </bean>
</beans>

错误是

javax.naming.NameNotFoundException: Name [TransactionManager] is not bound in this Context. Unable to find [TransactionManager].

堆栈跟踪如下

2016-11-29 13:47:37 ERROR ProcessEngines:174 - Exception while initializing process engine: Error creating bean with name 'processEngineConfiguration' defined in resource loaded through InputStream: Cannot resolve reference to bean 'transactionManager' while setting bean property 'transactionManager';
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in resource loaded through InputStream: Invocation of init method failed;
nested exception is javax.naming.NameNotFoundException: Name [TransactionManager] is not bound in this Context. Unable to find [TransactionManager].
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'processEngineConfiguration' defined in resource loaded through InputStream: Cannot resolve reference to bean 'transactionManager' while setting bean property 'transactionManager';
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in resource loaded through InputStream: Invocation of init method failed;
nested exception is javax.naming.NameNotFoundException: Name [TransactionManager] is not bound in this Context. Unable to find [TransactionManager].
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary

我不知道接下来要尝试什么

我使用的应用服务器是Tomee-plus 1.7.3

干杯 亚当

[编辑1]请注意,当应用程序准备就绪时,您需要加载JtaProcessEngineConfiguration手册,但CdiStandaloneProcessEngineConfiguration和CdiJtaProcessEngineConfiguration是通过ActivitiExtension类自动加载的。

[编辑2] 当在扩展的 JtaProcessEngineConfiguration(不带 cdi)中按如下方式查找事务管理器时(根据 @Romain Manni-Bucau 建议)

    try {
        InitialContext initialContext = new InitialContext();
        try {
            transactionManager = (TransactionManager) initialContext.lookup("openejb:Resource/TransactionManager");
        } finally {
            initialContext.close();
        }

    } catch (NamingException e) {
        LOGGER.error(e.getMessage(), e);
    }

我得到以下异常跟踪

2016-12-06 09:16:35 ERROR TestJtaProcessEngineConfiguration:29 - Name     "Resource/TransactionManager" not found.
javax.naming.NameNotFoundException: Name "Resource/TransactionManager" not found.
at org.apache.openejb.core.ivm.naming.IvmContext.federate(IvmContext.java:199)
at org.apache.openejb.core.ivm.naming.IvmContext.lookup(IvmContext.java:151)
at org.apache.openejb.core.ivm.naming.IvmContext.lookup(IvmContext.java:119)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
<snip>

[编辑 3] 尝试使用“java.naming.factory.initial=org.apache.openejb.core.OpenEJBI‌​nitialContextFactory”会产生以下堆栈跟踪。

Cannot instantiate class: org.apache.openejb.core.OpenEJBInitialContextFactory [Root exception is java.lang.ClassNotFoundException: org.apache.openejb.core.OpenEJBInitialContextFactory]
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:674)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.init(InitialContext.java:244)
at javax.naming.InitialContext.<init>(InitialContext.java:216)

但是使用“openejb:TransactionManager”的 jndi 字符串可以工作

成功 工作配置使用 jndiName 属性,如下所示。

<property name="jndiName" value="openejb:TransactionManager"></property>

最佳答案

使用 openejb:Resource/TransactionManager 怎么样?它在容器启动后就可用(甚至在任何部署之前)?这将使任何依赖事务管理器的代码不依赖于启动生命周期。

关于java - CdiJtaProcessEngineConfiguration 在加载事务管理器之前请求事务管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40858894/

相关文章:

java - 将字符串解析为日期戳不起作用。 java

java - 列表顶部的 TextView ,可滚动容器

java - 在Activiti Java Delegate内部启动进程并查询任务

eclipse - Stardust和Activiti有什么区别

apache - httpd 重复访问控制允许来源与 "Header always set"

java - Maven 依赖项失败并出现 501 错误

Java Quartz 作业持久化

java - Java的轻量级工作流引擎

java - 如何使用 web xml 使服务器响应不同的子域

JavaEE 解决方案配置最佳实践