0

我们有两个并行运行的 Informatica 作业。

一个从欧洲中部时间 11.40 开始,其中包含大约 300 个 Informatica 工作流,其中一个是 fact_sales。

另一个作业在 3.40 CET 运行,它有大约 115 个工作流,其中许多在数据一致性方面依赖于 fact_sales。

问题是 fact_sales 应该在流程 2 中的某些工作流程开始之前完成以使数据准确,但这通常不会发生。

我们正在尝试做的是拆分流程 2,使 fact_sales 相关的工作流仅在 fact_sales 完成后运行。

您能否提供一种方法来编写一个 unix shell 脚本来检查这个 fact_sales 的状态,如果它成功则启动其他相关的工作流程,如果没有,那么它应该发送失败邮件。谢谢

4

5 回答 5

0

我认为不需要为此编写自定义 shell 脚本。其中大部分是非常标准/常见的功能,可以使用命令任务和事件等待来实现。

**Process1 - 11:50 运行**
....工作流程
...
 fact_sales 工作流程。**最后添加命令任务
                      **这会丢下一个标志,例如 fact_sales_0430.done
...
....工作流程..500

并且所有依赖的进程都会有一个等待这个 .done 文件的事件等待。由于有多个相关的工作流程,请确保它们都不会立即删除文件。您可以在一天结束时或第二天开始加载时删除此 .done 文件。

工作流程1
......
dependantworkflow1 -- 事件等待,等待 fact_sales_0430.done(不删除文件)。
dependantworkflow2 -- 事件等待,等待 fact_sales_0430.done(不要删除文件)。
一些其他工作流程
dependantworkflow3 -- 事件等待,等待 fact_sales_0430.done(不删除文件)。
……
……
于 2012-04-30T20:54:59.237 回答
0

我认为下面提到的脚本对你有用。请更新参数。

    WAIT_LOOP=1
    while [ ${WAIT_LOOP} -eq 1 ]
    do
        WF_STATUS=`pmcmd getworkflowdetails -sv $INFA_INTEGRATION_SERVICE -d $INFA_DOMAIN -uv INFA_USER_NAME -pv INFA_PASSWORD -usd Client -f $FOLDER_NAME $WORKFLOW_NAME(fact_sales) | grep "Workflow run status:" | cut -d'[' -f2 | cut -d']' -f1`
            echo ${WF_STATUS} | tee -a $LOG_FILE_NAME
                    case "${WF_STATUS}" in
                            Aborted)
                               WAIT_LOOP=0
                               ;;
                            Disabled)
                               WAIT_LOOP=0
                               ;;
                            Failed)
                               WAIT_LOOP=0
                               ;;
                            Scheduled)
                               WAIT_LOOP=0
                               ;;
                            Stopped)
                               WAIT_LOOP=0
                               ;;
                            Succeeded)
                               WAIT_LOOP=0
                               ;;
                            Suspended)
                               WAIT_LOOP=0
                               ;;
                            Terminated)
                               WAIT_LOOP=0
                               ;;
                            Unscheduled)
                               WAIT_LOOP=0
                               ;;
                    esac
                    if [ ${WAIT_LOOP} -eq 1 ]
                    then
                            sleep $WAIT_SECONDS
                    fi
    done
            if [ ${WF_STATUS} == "Succeeded" ]
            then
                    pmcmd startworkflow -sv $INFA_INTEGRATION_SERVICE -d $INFA_DOMAIN -uv INFA_USER_NAME -pv INFA_PASSWORD -usd Client -f $FOLDER_NAME -paramfile $PARAMETER_FILE $WORKFLOW_NAME(dependent_one) | tee $LOG_FILE_NAME
            else
                    (echo "Please find attached Logs for Run" ; uuencode $LOG_FILE_NAME $LOG_FILE_NAME )| mailx -s "Execution logs" $EMAIL_LIST
                    exit 1
            fi
于 2015-04-10T10:18:33.227 回答
0

第二种方法可以如下 -

您必须运行某种调度程序来启动这些工作流。由于 Informatica 无法在一个集合中调度多个工作流,因此它只能在该依赖关系管理级别处理工作集/会话。

从调度程序中,跨销售事实加载 wf 和其他相关工作流创建依赖关系。

于 2012-05-04T07:17:27.150 回答
0

您可以使用 REP_SESS_LOG 等表从存储库数据库中触发查询,并检查事实销售的状态是否成功。然后只有您可以继续进行第二份工作。

于 2019-02-04T18:18:23.327 回答
0

我可以看到您面临的主要挑战 - 保持大量 infa 工作流程之间的依赖关系。你有两个选择——

  1. 您可以使用一些自动调度工具来设置依赖关系并正确运行它们。有许多免费工具,但取决于您的舒适度/时间/成本等,您应该选择。链接在这里
  2. 其次,您可以创建自定义作业调度程序。我使用 UNIX 脚本、oracle 表做了一个类似的调度程序。所以这里是步骤 -
    • 将您的所有工作流程分类。独立流应该进入组 1,而依赖于组 1 的流应该进入组 2,依此类推。
    • 将您的流程设置为从上述小组中一一挑选并开始他们。如果启动队列为空,则它应该等待。称之为循环2。
    • 保持一个轮询循环来检查启动流的状态。如果失败、中止等失败,则向用户发送邮件并将所有“队列中/相关”流标记为失败。如果运行继续轮询。如果成功,则将控制权交给循环 2。 -如果启动队列为空,则仅当该组中的所有工作流都成功时才转到下一个组。

这是一个有点棘手的过程,但一旦你设置它就会得到回报。您可以根据需要添加任意数量的工作流,与 infa 调度程序或 infa worklet 等相比,您的维护将更加顺畅。

于 2016-08-23T07:03:05.787 回答