2016-04-28 63 views
0

我想知道如果有人在這裏可以回答我的問題,因爲我一直在互聯網瀏覽這個東西一段時間。我知道在將SFSB注入SLSB時可能會得到「意想不到的結果」。我的理解是,這是因爲從SLSB到SFSB時,事務狀態會丟失。SFSB與@Asynchronous方法

我的問題是,如果我有一個無狀態Bean只有一個使用注入狀態EJB的異步業務方法,那麼我的缺點和可能的「意外結果」是什麼?

根據我的理解,當異步方法被調用並從另一個bean分離出來時,只有安全信息從上面通過異步方法,事務狀態會丟失。因此,如果SFSB只用於一個@Asynchronus方法,我可以將SFSB注入到SLSB中嗎?我在這裏錯過了什麼?

實施例簡化的代碼:

@Stateless 
public class SeedValuesBean { 
    /** 
    * Async action bean. 
    */ 
@EJB 
private SeedValuesAsyncBean asyncBean; 

public void performSeedValues() { 
    Future<String> result = asyncBean.seedValues(): 
    logger.info("Result :"+ result.get()); 
    } 
} 

@Stateless 
public class SeedValuesAsyncBean { 

@EJB 
private LowerBusinessBean lowerBean; // is stateful 

@Asynchronous 
public Future<String> seedValues() { 
    return new AsyncResult<>(lowerBean.getResult()); 
} 
} 

@Stateful 
public class LowerBusinessBean { 
    public String getResult() { 
    return Double.toString(Math.random()); 
    } 
} 

對於上下文我問,因爲如果我SeedValuesAsyncBean有狀態(所以我可以注入一個有狀態豆和不違反代碼),然後使SeedValuesBean有狀態爲同樣的原因,我失去了異步功能,所有事情都是同步發生的。

在此先感謝。

+0

爲什麼在SLSB中需要SFSB? SLSB將不知道要注入哪個SFSB(許多用戶/客戶端),並且您不會在SFSB中使用任何「狀態」。 – Geinmachi

+0

在@Async方法的調用之間不需要狀態。在方法內部處於穩定狀態。 – astropcr

+0

好像'LowerBusinessBean'應該是'@ Singleton'。 –

回答

1
  1. 注入SFSB到SLSB的缺點是,你SLSB的每次調用可以調用它的不同實例具有不同的SFSB實例(具有不同的狀態)注入到它。這似乎會產生「意想不到的結果」。
  2. 你的理解是交易狀態「丟失」是有點謬誤的。由於上述第1項,國家失去了,而不是因爲交易不穩定。

您可以通過@Singleton委託給您的SFSB。然後你將保證每次都得到相同的SFSB。