コンテキスト:カスタムスコープを持つSpringアプリケーションでBeanをプログラムで「公開」する方法
Springを使用してJMSから送信されるメッセージにtreamentを適用する必要があります。私はプロセス全体の中で最も大きな部分を支配していませんが、それは単一のスレッド(通常はいくつかの情報はThreadLocalsを使用して利用可能です)で行われることを知っています。
私はサービスのチェーンを呼んでいます。私は、これらのサービスのメソッドの署名、または初期化された方法について実装上のみで制御することはできません。
チェーンのエントリポイントから最新のステップに情報を渡す必要があります。私はこのためにThreadLocalを使うことができましたが、SpringのThread Scopeを使ってそれを行う方法があるのだろうかと思っていました。私は何ができるか
:私は(一種の)やりたい何
public class ThreadHolder {
private static final ThreadLocal<Object> objectThreadLocal = new ThreadLocal<>();
public static Object getObject() {
return objectThreadLocal.get();
}
public static void setObject(Object object) {
objectThreadLocal.set(object);
}
public static void cleanObject() {
objectThreadLocal.remove();
}
}
public class MyController {
public MandatoryInsurance process(JMSMessage message) {
Object valueToPassDown = retrieveReferenceValueCode(); //Object here, but could be a String if easier
ThreadHolder.setObject(valueToPassDown);
TreamentResult treamentResult = chainEntryPoint.startTreament(message); //The chainEntryPoint will call chainStep.executeTreamentStep)
return treatmentResult;
}
}
public class ChainStep {
public TreamentResult executeTreatmentStep(JMSMessage message) {
Object valuePassedDown = ThreadHolder.getObject()
// Do treament
}
}
:
public class MyController {
@Autowired
ApplicationContext context;
public MandatoryInsurance process(JMSMessage message) {
Object valueToPassDown = retrieveReferenceValueCode(); //Object here, but could be a String if easier
context.put("valueToPassDown", valueToPassDown, "thread");
TreamentResult treamentResult = chainEntryPoint.startTreament(message); //The chainEntryPoint will call chainStep.executeTreamentStep)
ThreadHolder.cleanOject();
return treatmentResult;
}
}
public class ChainStep {
public TreamentResult executeTreatmentStep(JMSMessage message) {
Object valuePassedDown = context.getBean("valueToPassDown");
// Do treament
}
}