2016-11-29 72 views
0

我成功地获得了Activiti使用JtaProcessEngineConfiguration并单独使用CdiStandaloneProcessEngineConfiguration。CdiJtaProcessEngineConfiguration在加载之前请求事务管理器

,但我不能够得到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:名称[事务管理]不是 在此上下文中绑定。无法找到[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加1.7.3

干杯 Adam

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

[编辑2] 当一个扩展JtaProcessEngineConfiguration内查找事务管理器如下(按@Romain曼尼 - Bucau建议)(不CDI)

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) 

但使用的JNDI字符串 “OpenEJB的:事务管理器” 的作品

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

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

尝试将属性值更改为“java:comp/env/TransactionManager”。也许这会有所帮助。但一般的问题是,jndi-name“TransactionManager”没有绑定在命名空间“java:comp” –

+0

@MaximKreschishin谢谢你的回复,我明白,它不是那么简单的tho。 JtaProcessEngineConfiguration能够查找TransactionManager,但在Application Deploy Cycle中稍后会调用它。 随着一些不确定性和tomfoolary我将获得CdiJtaProcessEngineConfiguration稍后在应用程序部署周期加载事务管理器,但它远离生产安全代码。 – Adz

回答

0

随着@Romain曼尼 - Bucau帮助的解决方案是“OpenEJB的:事务管理”的JNDI名称

我的编辑让我接受@Romain曼尼 - Bucau答案被拒绝了,在这里张贴了正确的答案。

1

怎么样使用openejb:资源/ TransactionManager一旦容器启动(即使在任何部署之前)可用?这将使任何依赖于事务管理器的代码不依赖于启动生命周期。

+0

谢谢您的回复,但是, 我无法通过“openejb:Resource/TransactionManager”查找事务管理器,请参阅上面的编辑。 – Adz

+0

也许设置java.naming.factory.initial = org.apache.openejb.core.OpenEJBInitialContextFactory如果hibernate运行在非托管线程中 –

+0

请参阅编辑3,使用java.naming.factory.initial = org.apache.openejb.core。 OpenEJBI nitialContextFactory给出了一个堆栈跟踪,但使用“openejb:TransactionManager”的作品(没有任何属性InitialContext) 这是从Tomee pov无效? – Adz

相关问题