Oozie Workflow EL 函数 timestamp() 不给秒

Oozie Workflow EL function timestamp() does not give seconds

我有以下 Oozie 工作流程:

<workflow-app name="${workflow_name}" xmlns="uri:oozie:workflow:0.4">

    <global>
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <configuration>
            <property>
                <name>mapred.job.queue.name</name>
                <value>${launcherQueueName}</value>
            </property>
            <property>
                <name>mapred.queue.name</name>
                <value>${launcherQueueName}</value>
            </property>
        </configuration>
    </global>

    <start to="email-1" />

    <action name="email-1">
        <email xmlns="uri:oozie:email-action:0.1">
            <to>${toEmailList}</to>
            <cc>${ccEmailList}</cc>
            <subject>ts</subject>
            <body> 
                TIMESTAMP:  ${timestamp()}
            </body>
        </email>

        <ok to="mail-2" />
        <error to="kill-fail" />
    </action>

... 4 more actions for mail-2, mail-3 and mail-4

    <kill name="kill-fail">
        <message>${workflow_name} failed, error
            message[${wf:errorMessage(wf:lastErrorNode())}]
        </message>
    </kill>

    <end name="end" />
</workflow-app>

我收到的电子邮件的时间戳值为

TIMESTAMP:  2016-01-27T16:19Z

根据EL定义,应该是这样的格式:(YYYY-MM-DDThh:mm:ss.sZ

为什么我没有得到秒数?

我实际上想做的是:我想弄清楚这四个函数调用是否总是 return 相同的值或不同的值。我需要一些不会改变的东西,所以如果 timestamp() 对我不起作用,那么我想考虑协调器的 NominalTime / ActualTime EL 函数。

如果我们无法获取时间戳中的秒数,有没有办法暂停每个动作,让它们在超过一分钟的时间范围内执行?

编辑: Samson Scharfrichter 总结了以下答案:

1) 为什么 timestamp() 中没有秒数?

Previous versions had seconds but version 4.2 does not.

2) 有没有可以秒秒的功能?

AFAIK No

3) 如何在工作流的所有动作中使用相同的时间值?

Pass coord:nominalTime() as a property from coordinator and use it multiple times in actions.

4) 如何让工作流程中的动作暂停?

Thre is no simple way. Use a java action - a jar with a simple class which does Thread.sleep()

引用 Oozie documentation for V4.2

4.2.2 Basic EL Functions

String timestamp()

It returns the current datetime in ISO8601 format, down to minutes (yyyy-MM-ddTHH:mmZ), in the Oozie's processing timezone, i.e. 1997-07-16T19:20Z

这似乎与您得到的非常一致。

如果您愿意,您可以将 coord:nominalTime() 格式化为秒,但是 在协调器 中 - 因此您必须将结果填充到 <configuration> 属性 将其转发到工作流脚本。

而 AFAIK coord:actualTime() 指的是 non-deterministic 时间,在过去,当协调器开始考虑其下一个工作流实例时。想不到有什么用

顺便说一句,我没听懂 "what [you] are actually trying to do" ;如果您想要的只是为您的操作生成唯一的 ID,您有很多方法可以做到这一点,而无需依赖 Oozie 速度慢并且不会在同一秒内执行多个操作这一事实。