EJB TransactionAttribute.NOT是否支持Cascades?

时间:2014-05-03 05:42:20

标签: java-ee transactions jpa-2.0 ejb-3.0 enter

这个问题仅供我的学术目的使用。任何回复都将受到高度赞赏

假设我有一个带有EJB TransactionAttribute.NOT_SUPPORTED的MDB。

@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 NOT_SUPPORTED?或者只是保持原样,因为调用OnMessage()已经被声明为NOT_SUPPORTED

问题#3 假设SSS-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 个答案:

答案 0 :(得分:1)

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

  

问题#1 。我为onMessage(),容器指定了NOT_SUPPORTED   在没有任何事务的情况下执行onMessage()。当。。。的时候   从onMessage()调用SSB-1.method1(),容器仍然是   执行SSB-1.method1()没有任何交易?(根据它的   定义)

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

  

问题#2 如果我希望SSB-1.method1在没有事务的情况下执行,我应该明确提到SSB-1的NOT_SUPPORTED   在bean或method1()级别?或者只是保持原样   调用OnMessage()已经声明为NOT_SUPPORTED

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

  

问题#3 假设SSS-1.method1()正在调用我需要管理事务的另一个SSB-2,请将下面的定义   工作

CMT bean可以接受CMT发起的交易。 BMT,但反过来并非如此。 BMT将暂停交易&总是自己创造新的。根据您的示例代码,它无法正常工作,SSB-1是CMT而SSB-2是BMT。