jakarta-ee - TomEE 7.0.0 上 ManagedScheduledExecutorService 任务中的事务?

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

语境

我想使用 ManagedScheduledExecutorService 安排重复的后台任务.我得到了我的 Runnable s/Callable通过 Instance ,所以我的任务中有可用的注入(inject)功能。

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

问题

由于这些任务正在访问数据库,因此它们需要一个事务。然而,在Runnable/Callable没有交易处于事件状态。

用户交易

documentation for ManagedScheduledExecutorService指出

If a transaction is required, use a javax.transaction.UserTransaction instance. A UserTransaction instance is available (...) by requesting an injection of a UserTransaction object using the Resource annotation.



然而,注入(inject)
@Resource
private UserTransaction userTransaction;

null调用任务时。

无状态bean

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

这导致启动时出现以下异常:
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 工作正常,因为所有实例都是使用注入(inject)获得的?
  • 为什么@ResourceUserTransaction 注入(inject)失败?
  • 最佳答案

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

    @Inject
    private UserTransaction userTransaction;
    

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

    关于jakarta-ee - TomEE 7.0.0 上 ManagedScheduledExecutorService 任务中的事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34024242/

    相关文章:

    javascript - 如何避免每次创建要部署在 glassfish 上的新 Java EE 包时复制整个 dojo 库?

    java - Java EE 中的抽象类和 Servlet

    java - 从 REST 中的资源路径获取占位符值?

    java - 通过 applicationcontext.xml 将值列表注入(inject)通用列表?

    java - 按功能打包好不好?

    jboss - 添加Jboss启动/关闭逻辑

    java - 添加 sun-cmp-mappings.xml 文件

    java - GlassFish 5 上的 JNDI 查找失败

    java - Java EE 7-ManagedThreadFactory可能的限制

    java - 使用 Spring 3.1 使用外部 Web 服务