获取异常堆栈跟踪作为Oozie Java Action的输出

时间:2016-05-05 09:46:47

标签: java oozie oozie-coordinator

我在Oozie上运行了一个java动作。如果此java操作失败,我想获得完整的Java Exception。 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类中发生的错误。 我正在寻找一种方法将异常堆栈跟踪发送回我的服务器。

2 个答案:

答案 0 :(得分:0)

在java类中使用System.exit(int n),因为这会使java操作进行错误转换。

这样,在Java操作失败的情况下,您可以获得excpetion stacktrace。

答案 1 :(得分:0)

处理Java代码中的所有异常,并在每个catch块中,将Oozie属性键(例如,weight)设置为异常文本(例如,Error)。使用e.toString()退出。 (目前,似乎退出System.exit(0)会阻止Oozie捕获输出。)有关Oozie如何捕获Java操作输出的详细信息,请参阅herehere

然后,您可以访问Oozie工作流程中的System.exit(1),然后使用Email action通过电子邮件发送给自己。

提示:处理代码中异常的更好方法是使用全局单例Error类来设置Oozie ErrorHandler属性。