获取正在运行的Databricks Job的类名

问题描述

一个 Apache Spark Scala 项目( runnerProject ),该项目在同一软件包( sourceProject )中使用另一个项目。源项目的目的是获取正在运行的Databricks作业的名称和版本。

以下方法的问题是,当从 runnerProject 调用时,它返回 sourceProject的详细信息,而不是 runnerProject 名称和版本

sourceProject的方法

class EnvironmentInfo(appName: String) {
 
override def getJobDetails(): (String,String) = {
    val classpackage = getClass.getPackage

    val jobName = classpackage.getImplementationTitle
    val jobVersion = classpackage.getImplementationVersion

    (jobName,jobVersion)
  }
 }

runnerProject使用sourceProject作为包:

import com.sourceProject.environment.{EnvironmentInfo}

 class runnerProject {
  def start(
      environment: EnvironmentInfo
  ): Unit = {

// using the returned parameters of the environment

}

如何以 getJobDetails() sourceProject 中运行的方式解决此问题,以便也可以从其他项目中调用它,而不是只是 runnerProject 。并且,它应该返回有关“呼叫者”作业的详细信息

提前谢谢! :)

解决方法

尝试以下操作,它从堆栈跟踪中获取调用类的名称,并使用它来获取实际的类及其包。

class EnvironmentInfo(appName: String) {
 
override def getJobDetails(): (String,String) = {
    val callingClassName = Thread.currentThread.getStackTrace()(2).getClassName
    val classPackage = Class.forName(callingClassName).getPackage

    val jobName = classPackage.getImplementationTitle
    val jobVersion = classPackage.getImplementationVersion

    (jobName,jobVersion)
  }
 }

如果直接调用它,它将起作用,如果从lambda函数中调用它,则可能会给您错误的包。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...