【问题标题】:Oracle DBMS_SCHEDULER use case to run 1 job at a time but queue subsequent jobs to run FIFOOracle DBMS_SCHEDULER 用例一次运行 1 个作业,但将后续作业排队以运行 FIFO
【发布时间】:2021-05-18 12:49:30
【问题描述】:

创建一个资源,并将作业限制为 1 个

begin dbms_scheduler.create_resource(resource_name=>'SO_TEST_RESOURCE',units=>'1'); END;

虽然我可以创建作业、分配资源甚至优先级,但排队的后续作业(分配给相同资源和各种优先级)以随机顺序运行,而不是按 FIFO 顺序运行,也不是按优先级顺序运行。寻找一种方法来强制排队的下一个作业(分配给同一资源)成为运行下一个的作业。

DBMS_SCHEDULER.create_job (
                       job_name        => 'SO_JOB1_TEST_RESOURCE',
                       job_type        => 'PLSQL_BLOCK',
                       job_action      => 'begin DBMS_SESSION.sleep(40); end;',
                       auto_drop       => true,
                       start_date      => systimestamp,
                       enabled         => false);

 DBMS_SCHEDULER.set_resource_constraint (
                   object_name   => 'SO_JOB1_TEST_RESOURCE',
                   resource_name => 'SO_TEST_RESOURCE',
                   units         => 1); 

  DBMS_SCHEDULER.SET_ATTRIBUTE(
  NAME                                        => 'SO_JOB1_TEST_RESOURCE',
  ATTRIBUTE                                   => 'job_priority',
  VALUE                                       =>1 );                   
                   
   DBMS_SCHEDULER.enable('SO_JOB1_TEST_RESOURCE'); 

.... adding more jobs 2, 3, 4 run in random order

【问题讨论】:

  • 我假设这些工作不是幂等的?你能让它们幂等吗?
  • 我必须查找该术语。不确定这个概念是否适用。我只是想形成一个单一的文件行并确保没有人削减。 :) 不过谢谢。

标签: oracle dbms-scheduler


【解决方案1】:

Oracle DBMS_SCHEUDLER CHAINS 可能就是您要找的。你可以先创建一个链

BEGIN
DBMS_SCHEDULER.CREATE_CHAIN (
   chain_name          => 'my_chain1',
   rule_set_name       => NULL,
   evaluation_interval => NULL,
   comments            => 'My first chain');
END;
/

...然后将每个计划的作业作为链中的步骤添加到链中。

BEGIN
DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
   chain_name      =>  'my_chain1',
   step_name       =>  'my_step1',
   program_name    =>  'my_program1');
DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
   chain_name      =>  'my_chain1',
   step_name       =>  'my_step2',
   program_name    =>  'my_chain2');
END;
/

作业链可以做很多事情,比如检查状态、实现重启逻辑等。Oracle 文档将是很好的参考。

【讨论】:

  • 一条链将确保不同步骤以正确的顺序运行。并不是排队的相同作业,因为已经有该作业的一个实例正在运行,随后会按照它们排队的顺序运行。
  • 我相信你在技术上是正确的,我已经看过那条路线了。但是工作永远不会重新运行,只是 1 完成,不知道何时或是否会出现第二个。所以我必须想出一些复杂的东西来动态地查看现有的步骤并创建新的步骤,删除它们等等。似乎 FIFO 应该是免费的。使用队列表和简单的日期和一些轮询更容易滚动我自己。当优先级没有起到作用时,我感到很惊讶。谢谢你,我看到了一些很棒的链条应用。现在我只是让迟到的落后者跳线(也许):)
猜你喜欢
  • 2018-02-01
  • 2018-02-17
  • 1970-01-01
  • 2021-06-14
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
相关资源
最近更新 更多