具体来说,可以从具有不同上下文的同一SpelExpression上的多个线程安全地调用getValue(StandardEvaluationContext,Class)吗?
我看到Spring Source的Gary Russell提出并回答了这个问题。但是,我也看到有人报告并发问题。我查看了相关Spring类的源代码,我无法确定。
我想得到Spring开发人员或Spring用户的明确答案,他们在严重并发的环境中使用过这个类。
感谢。
答案 0 :(得分:3)
我知道你想要另一种意见,但我会澄清它是线程安全的,只要你在另一个线程使用它时不改变评估上下文(或者你每次使用一个新的评估上下文,如果你需要用变量等来定制它),
但是,您必须将根对象传递给getValue(),而不是在上下文中设置根对象(使用setRootObject()
- 这会改变上下文)。如果您有#root
个对象,请使用
getValue(EvaluationContext context, Object rootObject, Class<T> expectedResultType)
如果您没有根对象,并且不以其他方式改变上下文,则可以使用
getValue(EvaluationContext context, Class<T> expectedResultType)
带有共享上下文。
Spring Integration在(在很多情况下)高度多线程的环境中广泛使用SpEL。我们对所有静态情况使用相同的评估上下文(没有运行时变量),并将根对象(通常是消息)传递给getValue()
调用。对于需要向上下文添加变量的情况,每个评估都会获得一个新的评估上下文。