Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion src/main/java/com/blinkfox/fenix/helper/ParseHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.mvel2.MVEL;
import org.mvel2.templates.CompiledTemplate;
import org.mvel2.templates.TemplateCompiler;
import org.mvel2.templates.TemplateRuntime;
import java.util.Map;
import java.lang.ref.SoftReference;
import java.util.concurrent.ConcurrentHashMap;

/**
* MVEL 表达式解析相关的工具类.
Expand All @@ -17,6 +22,12 @@
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class ParseHelper {

/**
* 模板编译缓存,使用 SoftReference 实现内存敏感缓存.
* 当内存不足时,JVM 会回收软引用,防止内存溢出.
*/
private static final Map<String, SoftReference<CompiledTemplate>> TEMPLATE_CACHE = new ConcurrentHashMap<>();

/**
* 通过 MVEL 来解析表达式的值,该方法如果解析出错也不抛出异常.
*
Expand Down Expand Up @@ -57,7 +68,13 @@ public static Object parseExpressWithException(String exp, Object context) {
*/
public static String parseTemplate(String template, Object context) {
try {
return (String) TemplateRuntime.eval(template, context);
SoftReference<CompiledTemplate> ref = TEMPLATE_CACHE.get(template);
CompiledTemplate compiledTemplate = ref != null ? ref.get() : null;
if (compiledTemplate == null) {
compiledTemplate = TemplateCompiler.compileTemplate(template);
TEMPLATE_CACHE.put(template, new SoftReference<>(compiledTemplate));
}
return (String) TemplateRuntime.execute(compiledTemplate, context);
} catch (Exception e) {
throw new ParseExpressionException("【Fenix 异常提示】解析模板异常,解析出错的模板为:【" + template + "】.", e);
}
Expand Down