2016-04-28 12 views
0

私は今ここでこのようなことを見てインターネットを精練しているので、誰でも私の質問に答えることができるのだろうかと思っています。 SLSBにSFSBを注入する際に「予期しない結果」を得ることができると私は理解しています。これは、SLSBからSFSBに行くときにトランザクション状態が失われるためです。SFSBで@Asynchronousメソッドを使用した場合

私の疑問は、注入されたステートフルEJBが使用される非同期ビジネスメソッドが1つしかないステートレスBeanを使用している場合、私の不利な点は何か?

非同期メソッドが呼び出され、別のBeanからスピンオフされると、トランザクション情報は失われます。セキュリティ情報のみが上記の非同期メソッドに渡されます。したがって、SFSBが1つの@Asynchronusメソッドでのみ使用される場合、SFSBを自分のSLSBに挿入することはできますか?私はここで何が欠けていますか?

例簡略コード:私はSeedValuesAsyncBeanステートフルを加えた場合(私はステートフルBeanを注入していないコードに違反することができる)、次いでためSeedValuesBeanステートフルを行うためのコンテキストについて

@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()); 
    } 
} 

私は尋ねます同じ理由で、私は非同期機能を失い、すべてが同期して起こります。

ありがとうございます。

+0

なぜSLSBでSFSBが必要ですか? SLSBはどのSFSBを注入するか(多くのユーザ/クライアント)を認識せず、SFSBでは「状態」を使用しません。 – Geinmachi

+0

@Asyncメソッドの呼び出しの間に状態は必要ありません。メソッド内でちょうど安定した状態。 – astropcr

+0

'LowerBusinessBean'は '@ Singleton'でなければなりません。 –

答えて

1
  1. SLSBにSFSBを注入の欠点は、あなたのSLSBの各呼び出しは、それに注入(異なる状態で)異なるSFSBインスタンスを有することの別のインスタンスを呼び出すことができるということです。これは "予期しない結果"を作り出すようです。
  2. 取引状態が「失われている」というご理解は多少間違いです。トランザクションの不安定性のためではなく、上記の項目1のために状態が失われます。

@Singletonを通じてSFSBに委任できます。毎回同じSFSBを取得することが保証されます。

関連する問題