一个流口水规则没有间歇性地执行
One drools rule not executed Intermittently
我在文件中有一组流口水规则,预计会在 Java 对象的多个字段上触发。
一个特定的规则不会随机触发生产。
我尝试通过模拟产品负载进行重现,但无法重现。
场景:
Default valube city = London
规则:
If Name = John
then set City = Sydney
问题:
Name = John
City = London
//如果规则根据drl文件正确执行,预计悉尼
实施:
我正在使用 ExecuterService 和 FixedThreadPool 大小为 2.
在传递给 ExecuterService submit()
的 Callable 的 call()
内部,
我正在创建大小为 3 的 KieSession 的 ConcurrentLinkedQueue
。
规则文件在此处传递给 KieSession 构造函数。
我的分析:
我认为这个问题与多线程和同步有关。
由于 KieSession 对象在线程之间共享,是否会导致这样的问题?
或者是否存在我可能不知道的 Drool 规则的任何已知问题?
如果有人有任何线索,请告诉我。
提前致谢
我会检查的东西。
与execute(Runnable command)
不同,submit(Callable<T> task)
会捕获任何throwable并将其设置到内部字段中。你一定不要忘记做 Future#get()
来揭示后台发生的任何异常,否则没有人会注意到中断你 Callable
的错误。或者您可以使用 execute
异常将终止线程并出现在系统错误日志中。
你指的是 'random behavior' 我想到的唯一随机性是 drools 没有表现出预测的顺序,然后阻止具有相同显着性的规则的执行。是否可能是您在规则之间存在依赖关系并且一个规则创建了导致另一个规则无法启动的条件?并且由于流口水的随机性会阻止执行,所以这种情况很少发生。
当然,您有责任使您的 类 线程安全并以线程安全的方式访问数据。默认情况下 fireAllRules()
将执行 then
块的同一线程。但是,如果您创建多个线程,则必须考虑 bean 和数据的线程安全性,(通常)而不是 drools 本身。我看到默认城市是伦敦,它并不总是由(并行?)线程更新。你的情绪不稳定,不是吗?
写一个测试。你无法修复你无法复制的东西。 load or stress testing.
甚至可以重现间歇性问题
我在文件中有一组流口水规则,预计会在 Java 对象的多个字段上触发。 一个特定的规则不会随机触发生产。 我尝试通过模拟产品负载进行重现,但无法重现。
场景:
Default valube city = London
规则:
If Name = John
then set City = Sydney
问题:
Name = John
City = London
//如果规则根据drl文件正确执行,预计悉尼
实施:
我正在使用 ExecuterService 和 FixedThreadPool 大小为 2.
在传递给 ExecuterService submit()
的 Callable 的 call()
内部,
我正在创建大小为 3 的 KieSession 的 ConcurrentLinkedQueue
。
规则文件在此处传递给 KieSession 构造函数。
我的分析:
我认为这个问题与多线程和同步有关。
由于 KieSession 对象在线程之间共享,是否会导致这样的问题?
或者是否存在我可能不知道的 Drool 规则的任何已知问题?
如果有人有任何线索,请告诉我。
提前致谢
我会检查的东西。
与
execute(Runnable command)
不同,submit(Callable<T> task)
会捕获任何throwable并将其设置到内部字段中。你一定不要忘记做Future#get()
来揭示后台发生的任何异常,否则没有人会注意到中断你Callable
的错误。或者您可以使用execute
异常将终止线程并出现在系统错误日志中。你指的是 'random behavior' 我想到的唯一随机性是 drools 没有表现出预测的顺序,然后阻止具有相同显着性的规则的执行。是否可能是您在规则之间存在依赖关系并且一个规则创建了导致另一个规则无法启动的条件?并且由于流口水的随机性会阻止执行,所以这种情况很少发生。
当然,您有责任使您的 类 线程安全并以线程安全的方式访问数据。默认情况下
fireAllRules()
将执行then
块的同一线程。但是,如果您创建多个线程,则必须考虑 bean 和数据的线程安全性,(通常)而不是 drools 本身。我看到默认城市是伦敦,它并不总是由(并行?)线程更新。你的情绪不稳定,不是吗?写一个测试。你无法修复你无法复制的东西。 load or stress testing.
甚至可以重现间歇性问题