有时候对于经常改变的逻辑,容易增加频繁发布的成本。所以有了现在的文件配置中心,携程开发的apollo和google开源的consul都解决了这个问题。本文的重点介绍Java执行js,js放在配置中心上。
/**
* 使用js引擎执行js
* @param callTime
* @param timestamp
* @return
*/
private String formatCallTime(String callTime,String timestamp){
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
String script = whatsAppConfigHandler.getConfigInfo(whatsappServiceProperties.getDateParseScript());
try{
engine.eval(script);
Invocable invocable = (Invocable) engine;
String newCallTime = (String)invocable.invokeFunction("getCallTime", callTime, timestamp);
return newCallTime;
}catch (Exception e){
log.error("通话时间格式化失败!");
}
return callTime;
}
可以并不是像希望的那样完美的运行,遇到一个问题看了很多国外的网站都找不到类似的话题:

一行一行的代码定位,最后发现是我在js里面使用了箭头函数(js中的lambda表达式):
if (new RegExp(i18n.indonesian[0]).test(callTime)) {
var regex = /\s|\.|:/;
// 这里是用了箭头函数过滤数组
var data = callTime.split(regex).filter(item=>item);
if (data[1] in MonthConstant.Indonesian) {
var date = new Date(parseInt(timestamp));
var year = date.getFullYear();
var month = MonthConstant.Indonesian[data[1]];
var day = data[0];
var hour = data[2];
var minute = data[3];
return year + '-' + addZero(month) + '-' + addZero(day) + ' ' + hour + ':' + minute;
}
}
修改为常规的写法解决了问题:
if (new RegExp(i18n.indonesian[0]).test(callTime)) {
var regex = /\s|\.|:/;
var data = callTime.split(regex).filter(function(item) {
return !(!item || item === "");
});
if (data[1] in MonthConstant.Indonesian) {
var date = new Date(parseInt(timestamp));
var year = date.getFullYear();
var month = MonthConstant.Indonesian[data[1]];
var day = data[0];
var hour = data[2];
var minute = data[3];
return year + '-' + addZero(month) + '-' + addZero(day) + ' ' + hour + ':' + minute;
}
return callTime;
}
网友评论