【问题标题】:Does EJB TransactionAttribute.NOT SUPPORTED Cascades?EJB TransactionAttribute.NOT 支持级联吗?
【发布时间】:2014-06-19 21:10:07
【问题描述】:

这个问题仅用于我的学术目的。任何回应将不胜感激

假设我有一个带有 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()            
 }  

【问题讨论】:

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


    【解决方案1】:

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

    问题 #1。正如我为 onMessage() 指定 NOT_SUPPORTED 一样,容器 在没有任何事务的情况下执行 onMessage() 。当。。。的时候 SSB-1.method1() 从 onMessage() 调用,容器仍然 在没有任何事务的情况下执行 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。

    【讨论】:

    • 好吧,不要介意我重复你刚才所说的内容,但只是为了确保正确理解基础知识。你所说的是当 CMT 调用 BMT 时,来自 CMT 的事务不会传播到BMT 和 BMT 自己创建一个新事务,并由应用程序使用 userTransaction.begin 和 commit 管理。
    猜你喜欢
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2011-11-08
    • 2010-09-10
    • 2011-01-26
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多