2016-07-25 148 views
1

Apache Oozie具有oozie.wf.workflow.notification.url属性以通知自定义终端关于作业状态更新。将验证添加到Oozie工作流程通知

<property> 
    <name>oozie.wf.workflow.notification.url</name> 
    <value>http://SERVER:8080/endpoint/oozieUpdate?jobId=$jobId%26status=$status</value> 
</property> 

我有一个用例的端点必须验证传入的请求,我无法找到一个解决办法,让我来配置Oozie的,这样它会发送认证头,此通知URL(基本认证为例) 。有没有办法做到这一点?

回答

1

我怀疑你可以使用oozie.wf.workflow.notification.url在oozie的当前状态。我检查了oozie source code,发现这个:

org.apache.oozie.client.OozieClient(财产恒念):

public static final String WORKFLOW_NOTIFICATION_URL = "oozie.wf.workflow.notification.url"; 

org.apache.oozie.command.wf.WorkflowNotificationXCommand(常量被用来形成proxyConf变量):

public WorkflowNotificationXCommand(WorkflowJobBean workflow) { 
    super("job.notification", "job.notification", 0); 
    ParamChecker.notNull(workflow, "workflow"); 
    jobId = workflow.getId(); 
    url = workflow.getWorkflowInstance().getConf().get(OozieClient.WORKFLOW_NOTIFICATION_URL); 
    if (url != null) { 
     url = url.replaceAll(JOB_ID_PATTERN, workflow.getId()); 
     url = url.replaceAll(STATUS_PATTERN, workflow.getStatus().toString()); 
     proxyConf = workflow.getWorkflowInstance().getConf() 
       .get(OozieClient.WORKFLOW_NOTIFICATION_PROXY, ConfigurationService.get(NOTIFICATION_PROXY_KEY)); 
     LOG.debug("Proxy :" + proxyConf); 
    } 
} 

org.apache.oozie.command.NotificationXCommand(http使用proxyConf变量在WorkflowNotificationXCommand的超类中调用它本身):

protected void sendNotification() { 
    if (url != null) { 
     Proxy proxy = getProxy(proxyConf); 
     try { 
      URL url = new URL(this.url); 
      HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(proxy); 
      urlConn.setConnectTimeout(getTimeOut()); 
      urlConn.setReadTimeout(getTimeOut()); 
      if (urlConn.getResponseCode() != HttpURLConnection.HTTP_OK) { 
       handleRetry(); 
      } 
     } 
     catch (IOException ex) { 
      handleRetry(); 
     } 
    } 
    else { 
     LOG.info("No Notification URL is defined. Therefore nothing to notify for job " + jobId); 

    } 

} 

正如你所看到的没有标题在这里设置使用httpURLConnection.setRequestProperty(,)

虽然您可以使用自定义java操作来做一个解决方法,但是您可以使用任何您喜欢的标题来调用http调用。

1

作为解决方法,我为通知url创建替换变量。

<property> 
    <name>oozie.wf.workflow.notification.url</name> 
    <value>_NOTIFICATION_URL_</value> 
</property> 

然后我在每次运行作业时在URL中包含一个不同的密钥。

confXml.replaceAll("_NOTIFICATION_URL_", server + "/" + getRandomSecret()); 

本例中的信任锚是HTTPS。当我收到工作通知时,我可以通过比较密钥来确保它不是来自攻击者的。

相关问题