You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Azure Databricks中运行Drools的Scala PoC报错求助

Azure Databricks Scala运行Drools异常排查与示例代码

异常原因分析

  • 依赖缺失或版本不兼容:Drools 7.17.0-Final依赖的核心组件(如kie-api、kie-internal、drools-compiler)可能未完整导入;同时Databricks 11.3 LTS默认使用Java 11,而Drools 7.17.0-Final主要适配Java 8,JDK版本差异可能导致内部类初始化失败。
  • 资源路径错误:ResourceFactory.newClassPathResource("sample.drl")依赖类路径加载规则文件,但Databricks的类路径结构与本地JVM不同,直接用类路径加载大概率找不到文件,触发ResourceFactory初始化异常。
  • 类加载器冲突:Databricks自定义类加载器可能无法正确加载Drools的SPI服务(如ServiceRegistry中的实现类),导致ResourceFactory$LazyHolder初始化失败。

修复步骤

  1. 导入完整依赖:确保安装以下Drools核心组件(版本统一为7.17.0-Final):
    • org.drools:drools-core
    • org.drools:drools-compiler
    • org.kie:kie-api
    • org.kie:kie-internal
      在Databricks中可通过Maven坐标安装库,或上传对应jar文件到集群库路径。
  2. 调整规则文件加载方式:将规则文件上传到DBFS(如/dbfs/FileStore/drools/sample.drl),改用文件路径加载,规避类路径加载限制。
  3. 规避类加载冲突:若仍有问题,可在集群配置中添加JVM参数-Dorg.kie.util.ServiceRegistry.classLoader=current,强制Drools使用当前类加载器。

可运行示例代码

1. 准备规则文件

创建sample.drl,内容如下:

package com.example.rules

rule "Sample Rule"
when
    $msg: String()
then
    println("Rule triggered for message: " + $msg)
end

将文件上传到DBFS路径/dbfs/FileStore/drools/sample.drl。

2. Scala笔记本代码

import org.kie.api.io.ResourceType
import org.kie.api.runtime.KieSession
import org.kie.internal.builder.KnowledgeBuilderFactory
import org.kie.internal.io.ResourceFactory
import org.drools.core.impl.KnowledgeBaseFactory

class DroolsRuleService {
  // 从DBFS路径加载规则文件
  private val resource = ResourceFactory.newFileResource("/dbfs/FileStore/drools/sample.drl")
  private val kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder()
  
  // 编译规则并检查错误
  kbuilder.add(resource, ResourceType.DRL)
  if (kbuilder.hasErrors) {
    throw new RuntimeException("Rule compilation errors: " + kbuilder.getErrors)
  }

  private val kbase = KnowledgeBaseFactory.newKnowledgeBase()
  kbase.addPackages(kbuilder.getKnowledgePackages())

  def runRules(input: String): String = {
    val session = kbase.newKieSession()
    try {
      session.insert(input)
      session.fireAllRules()
      "Rules executed successfully"
    } finally {
      session.dispose()
    }
  }
}

// 测试执行
val service = new DroolsRuleService()
val result = service.runRules("Hello Drools on Databricks!")
println(result)

额外注意事项

  • 若使用Java 11集群,建议升级Drools到7.57.0-Final及以上版本(官方支持Java 11的稳定版本),减少版本兼容问题。
  • 避免使用过时的JavaConverters,Drools 7.x已兼容Java集合,无需手动转换。

内容的提问来源于stack exchange,提问作者ninja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:25:29