jakarta ee -执行EJB的TransactionAttribute.不支持级联



这个问题只是为了我的学术目的。如有任何回复,我们将不胜感激。

假设我有一个MDB与EJB TransactionAttribute.NOT_SUPPORTED.

@TransactionManagement(TransactionManagementType.BEAN)
@MessageDriven(name = "NonPersistentInquiryMessageBean", activationConfig = {    @ActivationConfigProperty(propertyName = "destinationType", propertyValue =          "javax.jms.Queue") })
public class InvoiceInquiryMessageBean implements MessageListener
{
 @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
 public void onMessage(Message msg) {
//calls a SSB-1 as defined below
//SSB-1.method1() 
 }
}
 @Stateless
 public class SSB-1 implements SSB-1Local
 {
   public void method1(){
 }

# 1问题。当我为onMessage()指定NOT_SUPPORTED时,容器执行onMessage()而不执行任何事务。当从onMessage()调用SSB-1.method1()时,容器是否仍然执行没有任何事务的SSB-1.method1() ?(根据其定义)

问题# 2 如果我想要SSB-1。Method1在没有事务的情况下执行,我应该明确提到在bean或method1()级别上不支持SSB-1 ?或者让它保持原样,因为调用OnMessage()已经被声明为NOT_SUPPORTED

问题# 3 假设ssss -1.method1()正在调用另一个我需要管理事务的SSB-2,下面的定义是否有效?

 @Stateless
 public class SSB-1 implements SSB-1Local
 {
   public void method1(){
            //call SSB-2.somemethod();
 }     
  @Stateless
  @TransactionManagement(TransactionManagementType.BEAN)
 public class SSB-2 
 {
   @Resource
   private UserTransaction userTransaction;
   public void somemethod(){
        userTransaction.begin();
        //biz logic
        userTransaction.commit()            
 }  

[您需要查看命名约定,这可能是为了演示,但仍然可以发布更好的命名约定]

问题# 1 。如指定NOT_SUPPORTED为onMessage(),容器在没有任何事务的情况下执行onMessage()。当SSB-1.method1()从onMessage()调用,将容器仍然执行SSB-1.method1()没有任何事务?(按定义)

不,这取决于SSB-1.method1()的事务属性,如果没有指定,则默认为Required &由于onMessage()没有任何正在进行的事务,因此将启动新的事务。

问题#2如果我想要SSB-1。如果SSB-1明确提到NOT_SUPPORTED,则可以在没有事务的情况下执行method1在bean还是method1()级别?或者让它保持原样调用OnMessage()已经被声明为NOT_SUPPORTED

需要明确提及SSB-1.method1(),与#1解释相同。最好是在方法级别,而不是在其他类方法上强制执行。

问题#3假设ssss -1.method1()正在调用另一个SSB-2,我需要为其管理事务,将定义如下工作。

CMT bean可以接受由CMT发起的交易;BMT,但反过来不是真的。BMT将暂停交易&总是自己创造新的东西。根据您的示例代码,它将不起作用,SSB-1是CMT,而SSB-2是BMT。

最新更新