Jakarta ee @Singleton bean初始化失败,因为它在';s标记的TransactionAttribute=不受支持

Jakarta ee @Singleton bean初始化失败,因为它在';s标记的TransactionAttribute=不受支持,jakarta-ee,transactions,ejb-3.1,weblogic12c,postconstruct,Jakarta Ee,Transactions,Ejb 3.1,Weblogic12c,Postconstruct,我在EJB3.1 bean初始化方面遇到了困难,更具体地说是由于感知到事务回滚而失败,尽管我已经用@TransactionAttribute(不受支持)标记了该bean。这意味着任何客户端事务都会在bean方法入口上暂停,直到退出(当它将被恢复时)。这绝对是我想要的事务处理方法 代码和错误的“要点”如下所示(注意,其中一些是手动启动的,以隐藏细节,但都是相关的和有代表性的): 这会引发以下错误: javax.ejb.NoSuchEJBException: Singleton MyClass(Ap

我在EJB3.1 bean初始化方面遇到了困难,更具体地说是由于感知到事务回滚而失败,尽管我已经用
@TransactionAttribute(不受支持)
标记了该bean。这意味着任何客户端事务都会在bean方法入口上暂停,直到退出(当它将被恢复时)。这绝对是我想要的事务处理方法

代码和错误的“要点”如下所示(注意,其中一些是手动启动的,以隐藏细节,但都是相关的和有代表性的):

这会引发以下错误:

javax.ejb.NoSuchEJBException: Singleton MyClass(Application: my-ear, EJBComponent: my-ejb.jar) failed to initialize.
当我调试时,实际上正在包装以下异常:

weblogic.ejb.container.InternalException: Transaction marked rollback or not expected transaction status: 4
同样,调试引发了一些有趣的细节:

  • 首先,我的
    MyClass#init
    正在完全成功地执行,没有任何问题/异常
  • 客户端代码(作为后期构造的一部分)首次调用my
    #doSomething
    方法时,将调用
    #init
  • 因此,在客户端调用
    MyClass#doSomething
    #init
    之间存在大量的堆栈间接寻址,异常是在这些层中的一层中引发的。它在WLS单例会话bean管理代码中引发的。请参阅下文
  • 堆栈类似于下面的堆栈(MyClass名称已更改):

    这个级别确实需要处理事务管理器,但我不知道为什么它应该尝试将事务标记为回滚,特别是在从主应用程序代码成功初始化之后

    我使用这个EJB组件来编译这个bean,但我们在服务器(或课程)上使用WLS EJB代码:

    我将检查预删除
    @TransactionAttribute
    场景中是否存在这些属性,并尝试观看
    ServerTransactionImpl

    更新2

    最近更新了一段时间……但是,我想我已经将问题追溯到了
    SingletonSessionManager#postCallback
    ,它是从上面原始堆栈跟踪中的
    SingletonSessionManager#constructandintbean
    调用的。如果/什么时候会报告,但我们在尝试回滚此处不存在的事务时似乎遇到了故障。

    N.B.这本来不是一个答案,但只是一些更有用的信息,用于深入查找此类问题的答案,因为在这一领域中确实没有太多联机信息。经过一些额外的努力,原因和答案已经确定e之后被发现。答案以原始格式保留,新发现作为编辑和调试帮助记录在案,希望能够简化其他类似问题的调试。这是一个黑暗的地方

    那么上面这个问题还没有明确的答案,这个问题似乎已经消失了

    不过,我发现(查看另一个
    NoSuchEJBException
    问题)根本原因被WLS堆栈吞没了

    如果您没有将SingletonBean初始化到
    PostConstruct
    方法中(即无法创建您的bean),那么可以从这里开始查找SingletonBean未能初始化NOSCHEJBException问题:

    最初,根异常被捕获并包含在较低级别的
    NoSuchEJBException
    s中,如上所述。然而,在下面的堆栈中,
    NoSuchEJBException
    被替换为一个
    InternalError
    ,该错误被包装并丢失原因。奇怪的是,它甚至可能将自身设置为原因(调试器有点乱):

    因此,这是查找根异常的最佳位置

    仅供参考:我在第二个实例中的问题是WLS(spring重新打包)中的spring注入问题,其中数据源没有正确注入到我的ELB服务impl中,因为数据源不存在
    @Resource(name=“…”)中
    JNDI名称。由于前面提到的异常处理问题,这根本没有被记录。一旦我找到了原因,这是一个简单的解决方法。遗憾的是,我花了这么多时间才找到它

    [编辑]仅供参考:我的问题导致“InternalException Transaction Rollback status 4”异常可能是由于EJB初始化(PostConstruct)超过了事务超时。如果我的EJB设置为
    @TransactionAttribute(不受支持),这应该与此无关
    但显然不是这样。调试显示,对于此和
    @TransactionAttribute(从不)
    ,有一个
    invokeTx
    用于
    SingletonSessionManager#constructAndInitBean
    级别,并在
    invokeWrapper
    中进行管理。因此,超时将导致回滚,导致映射到
    NoSuchEJBException
    内部异常被另一个
    no>所吞没异常
    导致垃圾错误消息

    [EDIT2]仅供参考:这似乎是由于WLS中的一个错误造成的,在WLS中,invokeTx被设置和管理,而它不应该用于
    @TransactionAttribute(不受支持)
    。我们向Oracle提出了一个错误,Oracle为其提供了sev 2。与此同时,我们已经转移了潜在的耗时(取决于网络)将
    @PostConstruct
    方法中的代码作为变通方法

    [EDIT3]仅供参考:来自Oracle…在singleton lifecycle拦截器postconstrcut/predestroy上未强制执行类级事务属性注释,因此默认为REQUIRED

    他们同意这是一个问题,并正在对此进行调查。同时,确保您的
    @PostConstruct
    中的代码不会违反事务超时。这将包括基于延迟的超时(我们的问题是间歇性的,因为它取决于访问哪个地理“服务器”)

    weblogic.ejb.container.InternalException: Transaction marked rollback or not expected transaction status: 4
    
    MyClass_fefgu8_Impl(MyClass).init() line: 96              
    NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]        
    NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57    
    DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43            
    Method.invoke(Object, Object...) line: 601          
    Jsr250Metadata.invokeLifecycleMethod(Object, Method, Object[]) line: 393      
    InterceptionMetadata(Jsr250Metadata).invokeLifecycleMethods(Object, LifecycleEvent) line: 365          
    InterceptionMetadata.invokeLifecycleMethods(Object, LifecycleEvent) line: 403              
    EjbComponentCreatorImpl.invokePostConstruct(Object, String) line: 80               
    SingletonSessionManager.constructAndInitBean() line: 369         
    SingletonSessionManager.access$300(SingletonSessionManager) line: 63            
    SingletonSessionManager$SingletonLifecycleManager.doActualInit() line: 798    <== InternalException raised here
    SingletonSessionManager$SingletonLifecycleManager.initInternal(boolean) line: 744     
    SingletonSessionManager$SingletonLifecycleManager.getBean() line: 648           
    SingletonSessionManager.getBeanFor(InvocationWrapper) line: 285      
    SingletonSessionManager.preInvoke(InvocationWrapper) line: 147         
    SingletonLocalObject(BaseLocalObject).getBeanInstance(InvocationWrapper) line: 146 
    SingletonLocalObject(BaseLocalObject).preInvoke(InvocationWrapper, ContextHandler, boolean, boolean) line: 103         
    SingletonLocalObject(BaseLocalObject).__WL_preInvoke(InvocationWrapper, ContextHandler) line: 67               
    SessionLocalMethodInvoker.invoke(Invokable, BaseLocalObject, InvocationWrapper, Object[], int) line: 20        
    MyClass_fefgu8_MyInterfaceImpl.doSomething(String, String, String, String) line: not available
    
    SingletonSessionManager$SingletonLifecycleManager.doActualInit() line: 798   
    
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.ejb</artifactId>
        <version>3.1</version>
        <scope>provided</scope>
    </dependency>
    
    SingletonSessionManager.constructAndInitBean() line: 377    
    
    wrap            weblogic.ejb.container.internal.InvocationWrapper  (id=15676)   
    L   callerTx    weblogic.transaction.internal.ServerTransactionImpl  (id=15681) 
    L   invokeTx    weblogic.transaction.internal.ServerTransactionImpl  (id=15683) 
    
    SingletonSessionManager$SingletonLifecycleManager.doActualInit() line: 819   
    SingletonSessionManager$SingletonLifecycleManager.initInternal(boolean) line: 744     
    SingletonSessionManager$SingletonLifecycleManager.getBean() line: 648           
    SingletonSessionManager.getBeanFor(InvocationWrapper) line: 285      
    
    SingletonSessionManager#getBeanFor