スレッド内とスレッド間の値伝達を実現し、ThreadLocalを合理的に使用する


以下はss 3 ex環境で
1、スレッドの理解
ユーザーはURLを要求し、トリガーされた一連の操作は、すべて1つのスレッドにあります.すなわち、servletで実行される操作はすべて1つのスレッドにあります.
//actionA  serviceA  
actionA(){
	serviceA();
}
//actionB  serviceB  
actionB(){
	serviceB();
}
//serviceA  A、B、C   
serviceA(){
	A();
	B();
	C();
	D();
	……
}
//serviceB  AA、BB、CC   
serviceB(){
	AA();
	BB();
	CC();
	DD();
	……
}
Struts 2のactionメソッドはservletメソッドであり、servletはスレッドが安全である.すなわち、マルチユーザがアクセスすると複数のスレッドが作成される.以上のactionAメソッドでは、呼び出されたすべてのメソッドが1つのスレッドにあります.以上のactionBメソッドでは、呼び出されたすべてのメソッドも1つのスレッドにあります.
ユーザは2つのURLを要求し、トリガされた一連の操作、すなわち2つのservletで実行された操作が1つのスレッドで保証されない.
あるユーザがactionAメソッドを要求し、actionBメソッドを要求すると、actionAメソッドとserviceAメソッドとactionBメソッドが1つのスレッドではなく、2つの異なるスレッドで実行される可能性があります.
2、スレッド内伝達値
スレッド内である上記第1の場合、スレッド内の伝値の前提条件は同期方法の伝値であり、同期とはBを実行した後、C方法、D方法を実行することである.すなわち、サービスAメソッドのAメソッドでは、後続のB、C、Dメソッドで共有できるThreadLocal変数が作成される.
3、スレッド間転送
スレッド間転送値は,異なるスレッドで共有され,3つのソリューションが挙げられる.
1つ目は、ユーザーがactionAメソッドを要求したときにset値をrequestに、ページにジャンプし、formフォームをページにコミットすると、actionBはrequestの値を取得します.
2つ目は、ThreadLocalとrequest(またはsession)を組み合わせて使用し、ユーザーがserviceAメソッドのAメソッドを要求すると、ThreadLocal変数を作成し(この場合B、C、Dメソッドで共有可能)、set値をrequest(またはsession)に、ページにジャンプし、formフォームをページにコミットすると、actionBはrequest(またはsession)の値を取得します.サービスBのBBメソッドではまずThreadLocalの値を取得し、なければrequest(またはsession)の値setをThreadLocalに入れることでBB、CC、DDメソッドでこの値を楽しむことができます.
第三に、spring securityの権限伝達値を採用し、spring securityの各ユーザーの権限をsessionのような変数に配置すると、actionAの値をspring securityの権限領域に配置することができ、後続のこのユーザーのすべての操作方法でこの値を楽しむことができます.
まとめ:プロジェクトの実際の状況と結びつけて、プロジェクトがspring security構築権限を採用する場合は、3つ目の方法を推奨します.そうしないと、2つ目を推奨します.
備考:なぜsessionを使わずに値を伝えるのかという質問があります.sessionはフロントの値を解決するしかないので、バックグラウンドの方法では値を伝えるのが面倒です.