为什么要使用定时任务

在一个固定的时间点活间隔一段时间需要频繁触发某一动作,为了使用便捷,有了定时任务,极大的减少了工作的重复性,提高了效率。


定时任务的内容

基于定时任务产生的背景,定时任务内容包括:定时任务的创建、任务到达时间点自动执行、删除任务、任务内容的修改(任务 id、任务的关闭开启、任务的触发时间、触发时间间隔、任务内容等)。


定时任务

1.创建表

CREATE TABLE tb_test(insert_date timestamp default null,id int default null);


2.创建定时任务

定时内容为:每间隔一分钟执行一次向表 tb_test 中插入(当前系统时间,1)

SELECT pkg_service.job_submit(1,'insert into tb_test values(sysdate,1);',sysdate,'''1min''::interval');

job_submit
-------------
1
(1 row)

创建定时任务成功

PKG_SERVICE.JOB_SUBMIT(
id            IN   BIGINT DEFAULT,
content       IN   TEXT,
next_date     IN   TIMESTAMP DEFAULT sysdate, 
interval_time IN   TEXT  DEFAULT 'null',  //默认只执行一次
job           OUT  INTEGER);

间隔三分钟,查看表中信息

auxdb=# select job_id,dbname,start_date,next_run_date,interval,failure_count from pg_job;
 job_id | dbname |         start_date         |       next_run_date        |     interval     | failure_count 
--------+--------+----------------------------+----------------------------+------------------+---------------
      1 | auxdb  | 2024-09-09 11:17:43.780788 | 2024-09-09 11:18:43.780788 | '1min'::interval |             0
(1 row)


auxdb=#  select * from pg_catalog.pg_job_proc pjp where job_id=1;
 job_id |                  what                  | job_name 
--------+----------------------------------------+----------
      1 | insert into tb_test values(sysdate,1); | 
(1 row)

auxdb=# select * from tb_test;
     insert_date     | id 
---------------------+----
 2024-09-09 11:17:44 |  1
 2024-09-09 11:18:44 |  1
 2024-09-09 11:19:44 |  1

(3 rows)

定时任务执行成功

3.定时任务停止

SELECT pkg_service.job_finish(1,true);
显示信息
job_finish
-------------
(1 row)

4.定时任务启动

SELECT pkg_service.job_finish(1,false);
显示信息
job_finish
-------------
(1 row)
PKG_SERVICE.JOB_FINISH(
id          IN   INTEGER,
broken       IN   BOOLEAN,  //true:禁用,false:启用
next_time    IN   TIMESTAMP  DEFAULT  sysdate);  //下一次运行时间

5.删除定时任务

SELECT pkg_service.job_cancel(1);
显示信息
job_cancel
-------------
(1 row)
PKG_SERVICE.JOB_CANCEL(
job  IN  INTEGER);  //指定作业号

修改定时任务的属性

PKG_SERVICE.JOB_UPDATE(
id             IN   BIGINT,
next_time      IN   TIMESTAMP,
interval_time  IN   TEXT,
content        IN   TEXT);

select pkg_service.job_update(1,null,'sysdate + 2/1440',null);

 job_id | dbname |         start_date         |       next_run_date       |     interval     | failure_count 
--------+--------+----------------------------+---------------------------+------------------+---------------
      1 | auxdb  | 2024-09-09 11:17:43.780788 | 2024-09-09 11:20:43.97129 | sysdate + 2/1440 |             0
(1 row)

 job_id |                  what                  | job_name 
--------+----------------------------------------+----------
      1 | insert into tb_test values(sysdate,1); | 
(1 row)

select * from tb_test;
auxdb=# select * from tb_test;

 2024-09-09 11:17:44 |  1
 2024-09-09 11:18:44 |  1
 2024-09-09 11:19:44 |  1
 2024-09-09 11:20:44 |  1
 2024-09-09 11:22:44 |  1
 2024-09-09 11:24:45 |  1
 2024-09-09 11:26:46 |  1