TASKCTL支持任意作业类型的扩展,但目前TASKCTL 4.1.3版本中并没有内置mysql存储过程的作业插件。通过介绍使TASKCTL支持调度mysql存储过程作业类型的步骤,一方面解决一些朋友迫切的mysql存储过程调度需求,另一方面抛砖引玉,让大家能够在TASKCTL中扩展更多的适应自己需求的作业插件。
1、在$TASKCTLDIR/src/plugin/mysqlproc/shell/目录中新增cprunmysqlproc.sh作业插件,实际上就是一个shell程序,代码如下:
#!/bin/sh if [ $# -ne 3 ] then echo "Param error !" echo "Usage: $0 progname para expara" exit 126 fi #------------------------------------------------------------------------------ # 第一步: 接收参数 #------------------------------------------------------------------------------ ProgName=$1 Para=`echo $2` #此处为了去前后空格,以便判断是否真正有入口参数 ExpPara=$3 #------------------------------------------------------------------------------ # 第二步: 解析exppara,分别获取数据库HOST,数据库名称、用户、密码等信息 #------------------------------------------------------------------------------ # 数据库名 并去前后空格 tmpstr=`echo ${ExpPara}|awk -F ',' '{print $1}'` DBHOST=`echo ${tmpstr}` # 数据库名 并去前后空格 tmpstr=`echo ${ExpPara}|awk -F ',' '{print $2}'` DBNAME=`echo ${tmpstr}` # 数据库用户 并去前后空格 tmpstr=`echo ${ExpPara}|awk -F ',' '{print $3}'` DBUSER=`echo ${tmpstr}` # 数据库密码 并去前后空格 tmpstr=`echo ${ExpPara}|awk -F ',' '{print $4}'` DBPASSWD=`echo ${tmpstr}` #------------------------------------------------------------------------------ # 第三步: 执行存储过程 #------------------------------------------------------------------------------ sqlstr=`mysql -h${DBHOST} -u${DBUSER} -p${DBPASSWD} <<EOF 2>&1 call ${DBNAME}.${ProgName}('${Para}',@retcode,@retmsg); select '\r'; select @retcode; select @retmsg; quit EOF` #------------------------------------------------------------------------------ # 第四步: 插件返回 #------------------------------------------------------------------------------ echo "================================================================================" result=`echo $sqlstr |awk '{print $3,$5}'` out=`echo $result |awk '{print $1}'` CMSG=`echo $result |awk '{print $2}'` echo ${CMSG} echo "" if [ $out -eq 0 ] then exit 0 else exit 1 fi
2、在桌面软件admin中进入"任务类型"功能中,设置mysqlproc作业类型,如下图所示:
3、在桌面软件designer中设计mysqlproc作业如下代码片段:
<!-- 按照插件程序的要求,para属性中设置一个输入参数,exppara属性中设置 主机名,数据库名,用户名,用户密码,用逗号隔开--> <mysqlproc> <name>MainModul_JobNode0</name> <progname>proc_taskctl</progname> <para>$(mysql_in_param1)</para> <exppara>$(mysqlhost),$(mysqldbname),$(mysqluser),$(mysqlpwd)</exppara> </mysqlproc>
4、附mysql存储过程程序 proc_taskctl 示例代码:
CREATE PROCEDURE `proc_taskctl`(IN msg VARCHAR(20),OUT retcode int,OUT retmsg varchar(255)) BEGIN SET retmsg = concat('hello:',msg); SET retcode = 0; END
5、至此就可以调用mysql存储过程了。
开源源码及介绍:https://www.oschina.net/p/taskctl
技术交流QQ群:75273038(一群)422877115(二群)