2

內交易方法是否有可能有狀態EJB本身內調用一個事務性方法?說得更清楚:調用相同的SFSB

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
@Stateless 
public class MyService { 

    @Resource 
    SessionContext ctx; 

    public void myMethod() { 
     // do something... 

     // invoke method from the same class 

     // As expected - this doesn't work as it's a regular local-call, 
     // it's not aware of EJB nature of this call. 
     save(); 

     // Doesn't work (although it worked with SLSB) 
     ctx.getBusinessObject(MyService.class).save(); 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void save() { 
     // do something... 
    } 
} 

現在我想實現的是讓用戶調用myMethod();我想確保這個方法在沒有JTA事務的情況下執行。在這個調用之後,我想調用save();方法將在事務中運行。

如果我使用ctx.getBusinessObject( - )的方法獲得:

警告:在EJB 爲MyService方法public void com.test.MyService.save調用期間發生系統異常() javax.ejb.IllegalLoopbackException:非法折返訪問:嘗試 做出對方法「公共無效 com.test.MyService.save()有狀態會話bean爲MyService迴環呼叫

SFSBs不支持內部呼叫嗎?

我正在運行Glassfish 3.1.1。

+0

就可以解決這個執行下列操作:注入相同的服務在您的類像這樣@EJB私人的MyService自我;然後在myMethod()中調用保存方法,如self.save()。我已經在wildfly8中試過了。 – anna

回答

2

這可能是在GlassFish EJB實現中的錯誤。當你調用一個具有不同事務屬性的方法時,它不會發生,每次對有狀態會話bean的重入調用都會發生。

只是嘗試把一個簡單的測試方法,在你的狀態bean,並通過業務對象代理調用它。你會得到同樣的例外。

在JBoss AS 7上,允許有狀態調用的有狀態調用。順便說一句,類似的bug在OpenEJB的存在前段時間:https://issues.apache.org/jira/browse/OPENEJB-1099

+0

謝謝Arjan。是的,我測試過它沒有不同的Tx屬性。我會在Glassfish JIRA上發佈這個消息,看看會發生什麼。 –

+0

謝謝!希望他們能儘快接受這個問題 –

+0

你有一個你的JIRA條目的網址嗎?我轉載的問題[這裏](https://github.com/MartinanderssonDotcom/java-ee-concepts/blob/master/src/test/java/com/martinandersson/javaee/ejb/sessionbeans/tests/StatefulTest.java) (見最後的測試方法)。你可以克隆這個Arquillian測試庫,並且很容易測試這個項目。默認的Maven配置文件使用Arquillian的GlassFish遠程適配器,因此該服務器正在運行。我爲WildFly(以前的JBoss)和GlassFish做過這個測試,因爲我不能僅使用EJB規範聲明優勝者/寬鬆者。 –