2020-08-27 04:44发布
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
好吧,假设我必须处理总计50个WP(在特定时间最多限制为10个),如何检查所有子WP是否已终止?
当然,它们具有相同的过程,但是由于外部因素,它们的处理时间可能会略有不同。 当前已完成,并在主程序中放入多少个WP,然后检查它们是否具有相同的值。
但是它不起作用。 我认为将会有某种标准的FM来检查以跟踪所有子WP。
任何想法都会受到赞赏。
对于大规模并行处理,请构建"工作包"以首先使用功能模块进行处理。 在包处理的结构中,添加一个GUID字段,然后为每个包获取一个。
然后,执行如下任务,其中 -guid是您创建的GUID。
通话功能" Z_YOUR_FM" 开始新任务 -guid 在任务结束时调用on_ret ON ....
" on_ret"方法应具有导入参数
方法ON_RET 输入 !P_TASK类型GUID_32。 方法on_ret。 数据:lt_data TYPE...。 lv_frtext TYPE char255, lv_subrc TYPE sy-subrc, lv_msg TYPE bapiret2-消息。 字段符号: TYPE gty_pack。 在guid = p_task的地方删除gt_task。 从功能" Z_YOUR_FM"获得的结果 导入et_rfc = lt_data ev_subrc = lv_subrc ev_frtext = lv_frtext。 使用表键guid = p_task读取表gt_pack 分配。 *如果读取失败,我们希望看到转储 ... 终结法。
在该方法内部,阅读您的工作包表并将其标记为已处理。 您甚至可以使用" start_timestampl"和" end_timestampl",以便可以跟踪哪个工作包消耗了多少时间。 这样您就可以知道哪个软件包已经被处理。
要控制使用的最大进程数,我使用了一个附加表" gt_tasks",该表在这样的" worker_get"方法中处理
TYPES:BEGIN OF gty_task, TYPE类型的时间戳, guid类型guid_32, 结束于gty_task。 数据:GTY_TASK的GT_TASK类型表。 方法WORKER_GET 输入 !IV_GUID类型GUID_32 返回 value(RV_OK)类型ABAP_BOOL。 方法worker_get。 常量:lc_task_max TYPE i VALUE 5。" <<<最大进程数 字段符号: TYPE gty_task。 ****************************************************** ******************** 检查:lines(gt_task)。 获取时间戳字段 -timestampl。 -guid = iv_guid。 rv_ok = abap_true。 "请参阅上面的检查
在循环中,在其中处理工作包的地方,等待这样的免费过程。
在gt_pack ASSIGNING 处循环播放。 等待异步任务直到(me-> worker_get(iv_guid = -guid)EQ abap_true)。 "等待直到me-> worker_get(iv_guid = -guid)EQ abap_true。" <<<在较旧的系统中,需要使用
最后,等待最后一个过程完成!
等待异步任务(gt_task IS INITIAL)。
如果锁有问题,则与RFC框架本身无关,而是与被调用函数模块的工作方式有关(如果它们并行工作,则可能存在一些交叉锁。 ..)如果没有更多信息,我无话可说。
在这种情况下,数据库锁一直是个问题,至少在ECC 6.0中(不确定HANA系统) 。 是的,只是在两者之间增加延迟是通常的处理方式。
或者在某些情况下(例如批量处理),我们只运行所有内容,然后仅再次运行由于任何错误而未处理的内容。 例如,在一个项目中,我们有一个IDoc接口在后台处理大量数据。 可以这么说,IDoc有时会互相踩到脚趾,然后尝试锁定相同的数据,然后失败。 因此,我们只是在同一工作的最后一步中添加了IDoc重新处理程序。 在那之后,我们很少遇到任何问题。 即使您不使用IDoc,也可以使用类似的策略:继续操作,然后再返回任何错误。
如果有人找到了更好的解决方案,我将非常有兴趣知道。
好,最后,我在代码中放入了一些重新处理的DO〜ENDDO子句,以删除Wait〜直到子句(感谢Jelena!)。 好吧,延迟0.3秒与重新处理之间没有什么区别。当然,我还没有测试过大量数据(10,000+),可以在大约500个数据集中找到,并行处理需要 比执行1 WP花费的时间更多(延迟/等待在SAT上始终是最重要的)。
好,谢谢大家的回复。
最多设置5个标签!
对于大规模并行处理,请构建"工作包"以首先使用功能模块进行处理。 在包处理的结构中,添加一个GUID字段,然后为每个包获取一个。
然后,执行如下任务,其中 -guid是您创建的GUID。
" on_ret"方法应具有导入参数
在该方法内部,阅读您的工作包表并将其标记为已处理。 您甚至可以使用" start_timestampl"和" end_timestampl",以便可以跟踪哪个工作包消耗了多少时间。 这样您就可以知道哪个软件包已经被处理。
要控制使用的最大进程数,我使用了一个附加表" gt_tasks",该表在这样的" worker_get"方法中处理
在循环中,在其中处理工作包的地方,等待这样的免费过程。
最后,等待最后一个过程完成!
如果锁有问题,则与RFC框架本身无关,而是与被调用函数模块的工作方式有关(如果它们并行工作,则可能存在一些交叉锁。 ..)如果没有更多信息,我无话可说。
在这种情况下,数据库锁一直是个问题,至少在ECC 6.0中(不确定HANA系统) 。 是的,只是在两者之间增加延迟是通常的处理方式。
或者在某些情况下(例如批量处理),我们只运行所有内容,然后仅再次运行由于任何错误而未处理的内容。 例如,在一个项目中,我们有一个IDoc接口在后台处理大量数据。 可以这么说,IDoc有时会互相踩到脚趾,然后尝试锁定相同的数据,然后失败。 因此,我们只是在同一工作的最后一步中添加了IDoc重新处理程序。 在那之后,我们很少遇到任何问题。 即使您不使用IDoc,也可以使用类似的策略:继续操作,然后再返回任何错误。
如果有人找到了更好的解决方案,我将非常有兴趣知道。
好,最后,我在代码中放入了一些重新处理的DO〜ENDDO子句,以删除Wait〜直到子句(感谢Jelena!)。
好吧,延迟0.3秒与重新处理之间没有什么区别。
当然,我还没有测试过大量数据(10,000+),可以在大约500个数据集中找到,并行处理需要 比执行1 WP花费的时间更多(延迟/等待在SAT上始终是最重要的)。
好,谢谢大家的回复。
一周热门 更多>