Мы сталкиваемся с NullPointerExceptions во время StatelessKieSession, когда он внутренне располагается в среде параллельного выполнения.
java.lang.NullPointerException
в org.drools.core.impl.StatelessKnowledgeSessionImpl.dispose (StatelessKnowledgeSessionImpl.java:395)
в org.drools.core.impl.StatelessKnowledgeSessionImpl.execute (StatelessKnowledgeSessionImpl.java:355)
Пример кода
public class ThreadExecutor {
public static void main(String[] args){
ExecutorService submitAsyncPool = Executors.newCachedThreadPool();
Callable<Boolean> processor = new WorkerThread();
for (int i = 0; i < 50; i++) {
submitAsyncPool.submit(processor);
}
}
}
public class WorkerThread implements Callable<Boolean> {
@Autowired
StatelessKieSession kieSession;
@Override
public Boolean call() {
// some code snippet
kieSession.execute(input);
// some code snippet
}
}
Это происходит только при одновременном выполнении правил. StatelessKieSessio
n совместно используется несколькими потоками и выполняется одновременно. Другой вариант - создавать StatelessKieSession
каждый раз, что я считаю очень дорогой операцией.
Похоже, это дефект движка правил? Есть ли обходной путь?
Примечание: мы используем Drools 6.x