具体地说,getValue(StandardEvaluationContext,Class)能否安全地从具有不同上下文的同一SpelExpression上的多个线程调用?
我看到来自Spring Source的Gary Russell提出并回答了这个问题。然而,我也看到人们报告并发问题。我浏览了相关Spring类的源代码,但我不能确定。
我希望从使用过spring-el的Spring开发人员或在高并发环境中使用过这个类的Spring用户那里得到一个明确的答案。
谢谢。
发布于 2014-07-11 04:56:23
我知道你想要另一种观点,但我要澄清的是,它是线程安全的,只要你在另一个线程使用它的时候不改变求值上下文(或者每次你都使用一个新的求值上下文,如果你需要用变量等来自定义它),
但是,您必须将根对象传递给getValue(),而不是在上下文上设置根对象(使用setRootObject() -这会改变上下文)。如果有#root对象,请使用
getValue(EvaluationContext context, Object rootObject, Class<T> expectedResultType)如果您没有根对象,并且不会以其他方式改变上下文,那么可以使用
getValue(EvaluationContext context, Class<T> expectedResultType) 具有共享的上下文。
Spring Integration在(很多情况下)高度多线程的环境中广泛使用了SpEL。我们对所有静态情况(没有运行时变量)使用相同的求值上下文,并将根对象(通常是消息)传递给getValue()调用。对于需要向上下文添加变量的情况,每个评估都会获得一个新的评估上下文。
https://stackoverflow.com/questions/24681567
复制相似问题