4

语境

我想使用ManagedScheduledExecutorService. 我通过 an获得我Runnable的 s/ s ,因此我的任务中有可用的注入功能。CallableInstance

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

问题

当这些任务正在访问数据库时,它们需要一个事务。但是,里面的Runnable/Callable没有事务是活跃的。

用户交易

ManagedScheduledExecutorService的文档指出

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

然而,注入

@Resource
private UserTransaction userTransaction;

null在调用任务时。

无状态bean

我采取的另一种方法是在我的任务中注入一个无状态 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)
(...)

测试用例

在 Github 上创建了一个小型测试用例项目。它包含两个分支,说明了上述问题。

问题

  • EJB不应该@Stateless正常工作,因为所有实例都是使用注入获得的吗?
  • 为什么@Resource注入UserTransaction失败?
4

1 回答 1

5

使用 CDI 获取它应该修复它:

@Inject
private UserTransaction userTransaction;

编辑:@Resource 案例的问题已解决:https ://issues.apache.org/jira/browse/TOMEE-1672

于 2015-12-01T16:36:51.213 回答