Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用多个并发会话时的NullPointerException_Java_Jboss_Drools_Redhat_Jbpm - Fatal编程技术网

Java 使用多个并发会话时的NullPointerException

Java 使用多个并发会话时的NullPointerException,java,jboss,drools,redhat,jbpm,Java,Jboss,Drools,Redhat,Jbpm,当会话在并发执行环境中进行内部处理时,我们将面临NullPointerException java.lang.NullPointerException 位于org.drools.core.impl.statelementKnowledgeSessionImpl.dispose(statelementKnowledgeSessionImpl.java:395) 位于org.drools.core.impl.statelementKnowledgeSessionImpl.execute(statel

当会话在并发执行环境中进行内部处理时,我们将面临NullPointerException

java.lang.NullPointerException 位于org.drools.core.impl.statelementKnowledgeSessionImpl.dispose(statelementKnowledgeSessionImpl.java:395) 位于org.drools.core.impl.statelementKnowledgeSessionImpl.execute(statelementKnowledgeSessionImpl.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

    }
}
公共类线程执行器{
公共静态void main(字符串[]args){
ExecutorService submitAsyncPool=Executors.newCachedThreadPool();
可调用处理器=新WorkerThread();
对于(int i=0;i<50;i++){
submitAsyncPool.submit(处理器);
}
}
}
公共类WorkerThread实现可调用{
@自动连线
无国籍会议;
@凌驾
公共布尔调用(){
//一些代码片段
执行(输入);
//一些代码片段
}
}
这只发生在规则的并发执行中<代码>会话n跨多个线程共享并并发执行。另一个选择是每次创建
会话
,我认为这是非常昂贵的操作

看起来这是规则引擎中的缺陷?有什么解决办法吗


注意:我们使用的是Drools 6.x,通过将Drools版本从6.1.0.Final升级到6.2.0.Final,我可以解决上述错误

我用6.2.0.Final执行了相同的测试用例,没有发现任何问题

听起来有点奇怪,但它解决了我们的问题


我希望它可以帮助其他人。

Drools KieSession本质上不是线程安全的,您必须为每个线程使用单独的会话,或者必须同步执行该语句。参考@Prog_G的可能副本-感谢回复!使用单独的会话意味着初始化资源等,并将影响性能:(和同步执行相同。是的。这种方式只有您可以将kieSession与多线程一起使用。下面链接中建议的一种可能的方式有助于解决此错误。但这看起来不是一个好的解决方案。。。。