上下文:如何在具有自定義作用域的彈簧應用程序中以編程方式「發佈」bean
我需要使用Spring對來自JMS的消息進行處理。我對整個流程的最大部分沒有任何控制權,但是我確實知道它發生在單個線程中(通常一些信息可以使用ThreadLocals)。
對於治療,我稱之爲服務鏈。我無法控制這些服務的方法簽名,或者只是在執行時如何初始化這些服務。
我需要將信息從鏈條的入口點傳遞到它的最新步驟。我可以使用這個ThreadLocal,但我想知道是否有辦法使用Spring的線程範圍來做到這一點。
我可以做什麼:
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
}
}