2014-07-10 3 views
1

특히, getValue (StandardEvaluationContext, Class)는 다른 SpelExpression에서 여러 컨텍스트로 안전하게 호출 할 수 있습니까?은 SpelExpression 스레드로부터 안전합니까?

이 질문을 보았고 Spring Source의 Gary Russell이 대답했습니다. 그러나 동시성 문제를보고하는 사람들도 있습니다. 관련 Spring 클래스의 소스 코드를 살펴 봤는데 확신 할 수 없습니다.

나는 스프링 - 엘에서 일한 스프링 개발자 또는 심하게 동시적인 환경에서이 클래스를 사용한 스프링 사용자로부터 분명한 답을 얻고 싶습니다.

감사합니다.

답변

0

다른 의견을 원하지만, 다른 스레드에서 사용하는 동안 평가 컨텍스트를 변경하지 않는 한 스레드로부터 안전하다는 것을 분명히합니다 (또는 매번 새로운 평가 컨텍스트를 사용하거나, 변수 등으로 사용자 정의해야하는 경우 을 사용하여 컨텍스트에 루트 객체를 설정하는 대신 getValue()에 루트 객체를 전달해야합니다. 당신이 #root 객체가있는 경우는 루트 개체를 가지고 있지 않으며, 다른 컨텍스트를 변이하지 않는 경우,

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

를 사용, 그것은 공유 컨텍스트

getValue(EvaluationContext context, Class<T> expectedResultType) 

를 사용하는 것이 괜찮습니다.

스프링 통합은 매우 많은 멀티 스레드 환경에서 (많은 경우) SpEL을 광범위하게 사용합니다. 모든 정적 사례 (런타임 변수 없음)에 대해 동일한 평가 컨텍스트를 사용하고 getValue() 호출에 루트 객체 (일반적으로 메시지)를 전달합니다. 컨텍스트에 변수를 추가해야하는 경우 각 평가는 새로운 평가 컨텍스트를 얻습니다.

+0

보증에 감사드립니다. Gary. 이것이 우리가하는 일입니다. 비공개 표현 exp = new SpelExpressionParser(). parseExpression ("# msg [ 'direction'] == '구매' ')); // 위의식이 다음 메서드에서 사용되는 것처럼 스레드로부터 안전하도록 해주십시오. // 공개 부울 패스 (Map 메시지) { StandardEvaluationContext context = new StandardEvaluationContext(); context.setVariable ("msg", message); return exp.getValue (context, Boolean.class); } – user3826255

+0

다시 한 번 감사드립니다. Gary. 서식이 어떻게 든 작동하지 않습니다. – user3826255

+0

예, 매번 새로운 평가 컨텍스트를 작성하기 때문에 문제가 없습니다. 그러나 하나의 변수'msg' 만 있기 때문에 공유 컨텍스트를 사용하고'[ 'direction'] == 'BUY' '('msg'는'# root' 객체입니다.) getValue (context, msg , Boolean.class)'. –

관련 문제