我在Oozie上运行了一个java操作。我想得到完整的Java异常,以防这个Java操作失败。Java操作只是使用一个jar文件。这是java动作
<workflow-app name='proj-wf' xmlns="uri:oozie:workflow:0.2">
<start to='startIndex'/>
<action name='startIndex'>
<java>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
</prepare>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<main-class>com.myproj.MyDriverJob</main-class>
<arg>-Dlww.commit.on.close=true</arg>
<capture-output/>
</java>
<ok to='end'/>
<error to='end'/>
</action>
<kill name='kill'>
<message>Java failed, error message[${wf:errorMessage(wf:lastErrorNode())}] </message>
</kill>
<end name='end'/>
</workflow-app>
它如何将我的java类中发生的错误发回。我正在寻找一种将异常stacktrace发送回服务器的方法。
在java类中使用System.exit(int n)
,因为这将使java操作进行错误转换。
通过这种方式,您可以在Java操作失败的情况下获得excpetion stacktrace。
处理Java代码中的所有异常,在每个catch块中,为异常文本(例如e.toString()
)设置一个Oozie属性键(比如Error
)。使用System.exit(0)
退出。(目前,使用System.exit(1)
退出似乎会阻止Oozie捕获输出。)有关Oozie如何从Java操作捕获输出的详细信息,请参阅此处和此处。
然后,您可以在Oozie工作流中访问Error
,并使用电子邮件操作将其发送给自己。
提示:在代码中处理异常的更好方法是使用全局单例ErrorHandler
类来设置Oozie Error
属性。