我按照步骤 - 1.创建了一个实现NativeScriptFactory的类。 2.创建了一个扩展AbstractSearchScript的类。
示例:
1
public class ExceptOperationScriptFactory implements NativeScriptFactory {
public ExecutableScript newScript(Map<String, Object> params) {
return new ExceptOperationScript(params);
}
}
2
public class ExceptOperationScript extends AbstractSearchScript {
private static int counter = 0;
@SuppressWarnings("unchecked")
public ExceptOperationScript(Map<String, Object> params) {
System.out.println(new Date()+ " -- Inside Constructor -- " + counter++);
}
public Object run() {
System.out.println(new Date()+ " -- Inside run -- " + counter++);
if (StringUtils.isNotBlank(field)) {
Object value = null;
if (source() != null)
value = source().get(field);
else if (doc() != null)
value = doc().get(field);
if (value != null)
System.out.println("BEFORE check value of Current document field's value :: " + value + "--"+ new Date());
}
return null;
}
}
控制台上的输出 -
Fri Nov 21 23:09:12 PST 2014 -- Inside Constructor -- 0
Fri Nov 21 23:09:12 PST 2014 -- Inside Constructor -- 1
Fri Nov 21 23:09:12 PST 2014 -- Inside Constructor -- 2
Fri Nov 21 23:09:12 PST 2014 -- Inside run -- 3
Fri Nov 21 23:09:12 PST 2014 -- Inside run -- 4
Fri Nov 21 23:09:12 PST 2014 -- Inside run -- 5
Fri Nov 21 23:09:12 PST 2014 -- Inside Constructor -- 6
Fri Nov 21 23:09:12 PST 2014 -- Inside Constructor -- 7
Fri Nov 21 23:09:12 PST 2014 -- Inside run -- 8
我无法在这里跟踪流程。为什么有随机的通话流? 根据我的调用顺序应该是Inside构造函数然后在Inside运行。
如何解决这个问题?我应该使方法和构造函数同步吗?
答案 0 :(得分:0)
你可能在这里遇到了一些线程,即Elasticsearch会将搜索扩展到多个线程,以便在单个节点上使用多个CPU核心。因此,脚本在多个线程中并行多次实例化,并且根据CPU调度,脚本的某些实例已经开始运行,而其他实例仍然构建。
tl; dr:由于你有多个线程,因此当并行启动时,执行顺序是不确定的。