quartz 如何动态传入自定义参数

1. 如何动态传入自己需要的参数?

需求:动态传参 (eg:传入job的执行方法)

思考:quartz 利用什么存储自己传入的参数?
           在数据库中存储的位置?
           如何取出存入的参数显示?

一、首先发现quartz 中用 jobDataMap 去存储附加信息(eg:自己定义传入的参数)
  • jobDataMap类:
    每个JobDetail都关联了一个JobDataMap实例,JobDataMap是java.util.Map的子类,基本上是提供key- value形式的数据,当你创建JobDetail的时候,可以把附加信息放到JobDataMap中,那么在execute方法中可以根据key找到需 要的值。

  • 有两种方式将数据添加到jobDataMap中:
    第一种:
    JobDetail job = new JobDetail…
    job.getJobDataMap().put(“key”,”value”);
    第二种:
    在这里插入图片描述
    以上两种方法都可以将自定义传入参数保存到jobDataMap中,此时,我们可以通过jobExecutionContext获取到jobDataMap.
    在这里插入图片描述

二、jobDataMap在数据库中的存储位置

打开数据库中各个数据表发现并无法直接看到有jobDataMap这个字段,因为官方表的表结构中并没有这个字段。但是其实数据是已经保存到数据库中,以Blob类型存在了JOB_DATA (QRTZ_JOB_DETAIL表) 中。
在这里插入图片描述

即使直接查询数据库该字段也是无法显示具体我们存入的信息。因为我用的是Navicat,所以可以通过文本显示出blob字段里面的具体内容。
在这里插入图片描述

  • 遇到的问题:
            当使用数据库存储JobDetail的时候(默认情况下使用RAM),我们不能把没有实现 java.io.Serializable的对象放入JobDataMap中,因为Quartz将使用Blob字段保存(也可以通过配置文件关闭)序列化 过的JobDataMap中的对象。所以我们存到数据库中的信息都是经过序列化并用blob字段保存,这样就会导致一个问题,我们并不能直接利用直接的sql语句取出我们想要的数据,需要经过一系列的处理。
        此处,可以通过配置文件关闭用blob保存。将下面代码处设为FALSE,默认值即为FALSE。因为最初参考别的人的配置文件是设置为TRUE,所以后来遇到blob转换问题,接下来会直接以TRUE为前提,分析一样遇到这种情况我如何从数据库中取出该 数据的。
    在这里插入图片描述
三、如何取出利用jobDataMap存到数据库中的数据(Blob类型)?

如果利用SQL直接select取出,该字段值为null
在这里插入图片描述

最开始的思考时,在Java中编写工具类,把取出的blob类型进行转换,但是此处从数据库取出的时候就没有得到数据,使用网上的blob转string工具类并没有达到想要的结果。后来思考可以在数据库查询取出数据的时候就进行转化(网上有很多mysql如何读取blob数据类型数据的教程),此处贴出我是如何使用的:

  1. Java中创建一个工具类
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值