【问题标题】:Transactions inside tasks of ManagedScheduledExecutorService on TomEE 7.0.0?TomEE 7.0.0 上 ManagedScheduledExecutorService 任务中的事务?
【发布时间】:2015-12-01 15:41:05
【问题描述】:

上下文

我想使用ManagedScheduledExecutorService 安排重复的后台任务。我通过Instance 获得了Runnables/Callables,因此我的任务中有可用的注入功能。

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

问题

当这些任务正在访问数据库时,它们需要一个事务。但是,在Runnable/Callable 内部没有事务处于活动状态。

用户交易

documentation for 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)
(...)

测试用例

我创建了一个小的test case project on Github。它包含两个分支,说明了上面提到的问题。

问题

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

【问题讨论】:

    标签: jakarta-ee ejb java-ee-7 apache-tomee tomee-7


    【解决方案1】:

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

    @Inject
    private UserTransaction userTransaction;
    

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

    【讨论】:

    • 谢谢!知道为什么无状态 EJB 不起作用吗?
    • 可能与@Resource 的问题相同(使用得太早,如果您使用单例启动,所有代码都应该没问题)
    • 谢谢。我根据您的输入更新了测试用例的两个分支。
    • @rmannibucau 可能跑题了,但由于这个问题是关于 TomEE 7 并且还没有发布,所以 7 是否有任何目标发布日期?
    • 这主要是一个法律问题,但对于一个普通的 tomee - 从用户的角度来看 - OpenJPA 是最重要的事情(从 JPA 2.0 到 2.1)但是使用羽流你几乎拥有一切已经有 EE 7(使用 eclipselinks 而不是 OpenJPA)。
    猜你喜欢
    • 1970-01-01
    • 2016-01-20
    • 2016-06-17
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多