我知道你想要另一種意見,但是我會澄清它是線程安全的,只要你不改變評估上下文而被另一個線程使用(或者你每次使用新的評估上下文,但是,您必須將根對象傳遞給getValue(),而不是在上下文中設置根對象(使用setRootObject()
- 這會改變上下文)。但是,您必須將根對象傳遞給getValue(),而不是在上下文中設置根對象(使用setRootObject()
)。如果你有一個#root
對象,請使用
getValue(EvaluationContext context, Object rootObject, Class<T> expectedResultType)
如果沒有根對象,也不要以其他方式發生變異的情況下,它的確定使用
getValue(EvaluationContext context, Class<T> expectedResultType)
與共享的上下文。
Spring Integration在許多情況下廣泛使用SpEL,這是一個高度多線程的環境。我們對所有靜態情況(無運行時變量)使用相同的評估上下文,並將根對象(通常爲消息)傳遞給getValue()
調用。對於需要向上下文添加變量的情況,每個評估都會得到一個新的評估上下文。
感謝您的保證,Gary。這就是我們正在做的。 ' private Expression exp = new SpelExpressionParser()。parseExpression(「#msg ['direction'] =='BUY'」); //希望上面的表達式是以下方法所使用的線程安全的。 (Map message){ StandardEvaluationContext context = new StandardEvaluationContext(); context.setVariable(「msg」,message); return exp.getValue(context,Boolean.class); } –
user3826255
再次感謝,加里。格式不起作用。 – user3826255
是的,這很好,因爲您每次都創建一個新的評估上下文。然而,由於您只有一個變量'msg',您可以使用共享上下文並使用'['direction'] =='BUY''('msg'是'#root'對象。'getValue(context,msg ,Boolean.class)'。 –