TomEE 7.0.0上ManagedScheduledExecutorService的任务内部的事务?

Sch*_*ser 4 ejb java-ee java-ee-7 tomee tomee-7

上下文

我想使用安排重复的后台任务ManagedScheduledExecutorService.我通过一个获得我的Runnables/Callables Instance,所以我的任务中有注入功能.

我的应用程序运行TomEE 7.0.0-SNAPSHOT webprofile.

问题

当这些任务访问数据库时,他们需要一个事务.但是,Runnable/ Callableno事务内部是活动的.

用户交易

ManagedScheduledExecutorService文档说明了这一点

如果需要事务,请使用javax.transaction.UserTransaction实例.通过使用Resource注释请求注入UserTransaction对象,可以使用UserTransaction实例(...).

但是,注入了

@Resource
private UserTransaction userTransaction;
Run Code Online (Sandbox Code Playgroud)

null在调用任务时.

无国籍豆

我采用的另一种方法是将无状态EJB注入到我的任务中,希望这会为我创建一个事务.

这导致启动时出现以下异常:

SEVERE: CDI Beans module deployment failed
java.lang.IllegalStateException: no interface to proxy for ejb StatelessEjb, is this is a MDB maybe you shouldn't use a scope?
    at org.apache.openejb.cdi.CdiEjbBean.createEjb(CdiEjbBean.java:252)
    at org.apache.openejb.cdi.CdiPlugin.getSessionBeanProxy(CdiPlugin.java:224)
    at org.apache.webbeans.container.BeanManagerImpl.getEjbOrJmsProxyReference(BeanManagerImpl.java:951)
    at org.apache.webbeans.container.BeanManagerImpl.getReference(BeanManagerImpl.java:777)
    at org.apache.webbeans.container.BeanManagerImpl.getInjectableReference(BeanManagerImpl.java:651)
    at org.apache.webbeans.inject.AbstractInjectable.inject(AbstractInjectable.java:111)
    at org.apache.webbeans.inject.InjectableConstructor.createParameters(InjectableConstructor.java:109)
    at org.apache.webbeans.inject.InjectableConstructor.doInjection(InjectableConstructor.java:72)
    at org.apache.webbeans.portable.InjectionTargetImpl.newInstance(InjectionTargetImpl.java:190)
    at org.apache.webbeans.portable.InjectionTargetImpl.produce(InjectionTargetImpl.java:173)
    at org.apache.webbeans.portable.AbstractProducer.produce(AbstractProducer.java:172)
    at org.apache.webbeans.component.AbstractOwbBean.create(AbstractOwbBean.java:127)
    at org.apache.webbeans.component.ManagedBean.create(ManagedBean.java:67)
    at org.apache.webbeans.context.DependentContext.getInstance(DependentContext.java:68)
    at org.apache.webbeans.context.AbstractContext.get(AbstractContext.java:124)
    at org.apache.webbeans.container.BeanManagerImpl.getReference(BeanManagerImpl.java:785)
    at org.apache.webbeans.inject.instance.InstanceImpl.create(InstanceImpl.java:306)
    at org.apache.webbeans.inject.instance.InstanceImpl.get(InstanceImpl.java:123)
(...)
Run Code Online (Sandbox Code Playgroud)

测试用例

在Github上创建了一个小测试用例项目.它包含两个分支,说明了上面提到的问题.

问题

  • @StatelessEJB 是否应该正常工作,因为所有实例都是使用注入获得的?
  • 为什么@Resource注射UserTransaction失败?

Rom*_*cau 5

使用CDI来解决它应该修复它:

@Inject
private UserTransaction userTransaction;
Run Code Online (Sandbox Code Playgroud)

编辑:问题已针对@Resource案例修复:https://issues.apache.org/jira/browse/TOMEE-1672

  • 可能与@Resource相同的问题(过早使用,如果使用单例启动,所有代码应该没问题) (3认同)