SpelExpression线程安全吗?

时间:2014-07-10 16:17:04

标签: multithreading spring spring-el

具体来说,可以从具有不同上下文的同一SpelExpression上的多个线程安全地调用getValue(StandardEvaluationContext,Class)吗?

我看到Spring Source的Gary Russell提出并回答了这个问题。但是,我也看到有人报告并发问题。我查看了相关Spring类的源代码,我无法确定。

我想得到Spring开发人员或Spring用户的明确答案,他们在严重并发的环境中使用过这个类。

感谢。

1 个答案:

答案 0 :(得分:3)

我知道你想要另一种意见,但我会澄清它是线程安全的,只要你在另一个线程使用它时不改变评估上下文(或者你每次使用一个新的评估上下文,如果你需要用变量等来定制它),

但是,您必须将根对象传递给getValue(),而不是在上下文中设置根对象(使用setRootObject() - 这会改变上下文)。如果您有#root个对象,请使用

getValue(EvaluationContext context, Object rootObject, Class<T> expectedResultType)

如果您没有根对象,并且不以其他方式改变上下文,则可以使用

getValue(EvaluationContext context, Class<T> expectedResultType) 

带有共享上下文。

Spring Integration在(在很多情况下)高度多线程的环境中广泛使用SpEL。我们对所有静态情况使用相同的评估上下文(没有运行时变量),并将根对象(通常是消息)传递给getValue()调用。对于需要向上下文添加变量的情况,每个评估都会获得一个新的评估上下文。