この質問は疑いではなく、実はヒントです。
各ビジネス メソッド呼び出しの前に、セッション EJB がすべての依存関係を再注入することをご存知でしたか? ええと、数分前まで知らなかったので、頭が痛くなりました。
依存性注入はインスタンスの作成時にのみ発生すると思っていましたが、そうではありません。EJB 3.1 の仕様には次のように書かれています。
「セッション Bean が依存性注入を利用する場合、コンテナーは、Bean インスタンスが作成された後、Bean インスタンスでビジネス メソッドが呼び出される前に、これらの参照を注入します。」セクション 4.3.2
どういうわけか、この定義は Stateless Session Bean に会話状態を持つ能力を与えることができます。それはまさに私が必要としていたものです。たとえば、SLSB に @SessionScoped Bean を注入すると、プールのどのインスタンスがリクエストを処理するかに関係なく、SessionScoped Bean は常に現在のクライアントのセッションに準拠します。つまり、SLSB インスタンスが別のクライアントの SessionScoped Bean を持つ可能性はありません。
これにより、2 人のユーザーが SLSB の同じインスタンスを交互に使用する場合に、SLSB が @Inject を介してログに記録されたユーザーをインスタンス フィールドとして受け取ることができます。例えば:
@Stateless
public class StatelessSessionBean{
@Inject
@LoggedInUser
protected User loggedInUser;//@SessionScoped
public void test(){
System.out.println("ejb:"+this);
System.out.println("user:"+this.loggedInUser);
}
}
次に、「test」メソッドのさまざまな呼び出しの結果は次のとおりです。
User 1 invoke
17:02:20,800 INFO [stdout] (http--0.0.0.0-8080-5) ejb:AccessControlBean@406189
17:02:20,801 INFO [stdout] (http--0.0.0.0-8080-5) user:User 1
User 2 invoke
17:02:56,227 INFO [stdout] (http--0.0.0.0-8080-8) ejb:AccessControlBean@406189
17:02:56,228 INFO [stdout] (http--0.0.0.0-8080-8) user:User 2
User 2 invoke
17:03:24,376 INFO [stdout] (http--0.0.0.0-8080-8) ejb:AccessControlBean@406189
17:03:24,378 INFO [stdout] (http--0.0.0.0-8080-8) user:User 2
User 1 invoke
17:03:24,517 INFO [stdout] (http--0.0.0.0-8080-6) ejb:AccessControlBean@1c05227
17:03:24,518 INFO [stdout] (http--0.0.0.0-8080-6) user:User 1
User 1 invoke
17:04:24,045 INFO [stdout] (http--0.0.0.0-8080-1) ejb:AccessControlBean@406189
17:04:24,047 INFO [stdout] (http--0.0.0.0-8080-1) user:User 1
User 2 invoke
17:04:24,179 INFO [stdout] (http--0.0.0.0-8080-8) ejb:AccessControlBean@1c05227
17:04:24,179 INFO [stdout] (http--0.0.0.0-8080-8) user:User 2
同じインスタンスを呼び出しても、フィールド「loggedInUser」はメソッドを呼び出したユーザーによって正しく異なることに注意してください。