quartz 中JobExecutionContext的使用

假如execute方法中需要一些额外的数据怎么办?比如说execute

中希望发送一封邮件,但是我需要知道邮件的发送者、接收者等信息?

存在两种解决方案:

1.JobDataMap类:

每个JobDetail都关联了一个JobDataMap实例,JobDataMap是java.util.Map的子类,基本上是提供key- value形式的数据,并提供了一些便利方法(主要是对java基本数据类型的支持,如put(String key,int value)),当开发人员创建JobDetail的时候,可以把附加信息放到JobDataMap中,那么在execute方法中可以根据key找到需 要的值。

JobDetail job = new JobDetail....

job.getJobDataMap().put("from","snowway@vip.sina.com");

...

在execute中

String from = jobExecutionContext.getJobDetail().getJobDataMap().getString("from");

....

不过,当你使用数据库存储JobDetail的时候(默认情况下使用RAM),这里有一个致命的弱点,你不能把没有实现 java.io.Serializable的对象放入JobDataMap中,因为Quartz将使用Blob字段保存(也可以通过配置文件关闭)序列化 过的JobDataMap中的对象。比如你在execute方法中需要一个java.sql.Connection接口实例,这种情况也是普遍的,那么通 常情况下你不能把Connection放入JobDataMap,即使你只想在execute中使用。(注:读者可暂时认为上面这段话是正确的,然而可以 通过指示quartz改变这种行为,那属于高级话题)

2.假如你需要一个java.sql.Connection,用于在execute中完成某些操作,那么你可以把Connection放入Quartz的 SchedulerContext中,execute也可以访问,并且Quartz不会持久化SchedulerContext中的任何东西。

scheduler.getContext().put("java.sql.Connection",connection);

execute中

Connection con = (Connection)jobExecutionContext.getScheduler().getContext().get("java.sql.Connection");

相关推荐
鸡鸭扣30 分钟前
Docker:3、在VSCode上安装并运行python程序或JavaScript程序
运维·vscode·python·docker·容器·js
paterWang1 小时前
基于 Python 和 OpenCV 的酒店客房入侵检测系统设计与实现
开发语言·python·opencv
东方佑1 小时前
使用Python和OpenCV实现图像像素压缩与解压
开发语言·python·opencv
我真不会起名字啊2 小时前
“深入浅出”系列之杂谈篇:(3)Qt5和Qt6该学哪个?
开发语言·qt
神秘_博士2 小时前
自制AirTag,支持安卓/鸿蒙/PC/Home Assistant,无需拥有iPhone
arm开发·python·物联网·flutter·docker·gitee
laimaxgg2 小时前
Qt常用控件之单选按钮QRadioButton
开发语言·c++·qt·ui·qt5
水瓶丫头站住2 小时前
Qt的QStackedWidget样式设置
开发语言·qt
Moutai码农3 小时前
机器学习-生命周期
人工智能·python·机器学习·数据挖掘
小钊(求职中)3 小时前
Java开发实习面试笔试题(含答案)
java·开发语言·spring boot·spring·面试·tomcat·maven
小白教程4 小时前
python学习笔记,python处理 Excel、Word、PPT 以及邮件自动化办公
python·python学习·python安装