我遇到了这个问题,我无法使用JDBC使用石英JobDataMap对对象进行反序列化。使用RAMJobStore的相同代码工作正常。
我只是创建了一个用于测试的基本类
import java.io.Serializable;
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
private String test;
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
}
然后在石英
Test test = new Test();
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("test", test);
并在Quartz工作
JobDataMap data = context.getMergedJobDataMap();
Test test = (Test) data.get("test");
我得到的例外就是这个
java.lang.ClassCastException:com.venclovas.quartz.buildings.Test 无法投射到com.venclovas.quartz.buildings.Test at com.venclovas.quartz.buildings.BuildingsUpgradeJob.execute(BuildingsUpgradeJob.java:39) 在org.quartz.core.JobRunShell.run(JobRunShell.java:202)at org.quartz.simpl.SimpleThreadPool $ WorkerThread.run(SimpleThreadPool.java:573)
当我调试返回的对象时 - 它对我来说非常好(在投射之前)
数据库定义
| QRTZ_TRIGGERS | CREATE TABLE `QRTZ_TRIGGERS` (
`SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_NAME` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_GROUP` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
`JOB_NAME` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
`JOB_GROUP` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
`DESCRIPTION` varchar(250) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`NEXT_FIRE_TIME` bigint(13) DEFAULT NULL,
`PREV_FIRE_TIME` bigint(13) DEFAULT NULL,
`PRIORITY` int(11) DEFAULT NULL,
`TRIGGER_STATE` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_TYPE` varchar(8) COLLATE utf8mb4_unicode_ci NOT NULL,
`START_TIME` bigint(13) NOT NULL,
`END_TIME` bigint(13) DEFAULT NULL,
`CALENDAR_NAME` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`MISFIRE_INSTR` smallint(2) DEFAULT NULL,
`JOB_DATA` blob,
PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
KEY `IDX_QRTZ_T_J` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),
KEY `IDX_QRTZ_T_JG` (`SCHED_NAME`,`JOB_GROUP`),
KEY `IDX_QRTZ_T_C` (`SCHED_NAME`,`CALENDAR_NAME`),
KEY `IDX_QRTZ_T_G` (`SCHED_NAME`,`TRIGGER_GROUP`),
KEY `IDX_QRTZ_T_STATE` (`SCHED_NAME`,`TRIGGER_STATE`),
KEY `IDX_QRTZ_T_N_STATE` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),
KEY `IDX_QRTZ_T_N_G_STATE` (`SCHED_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),
KEY `IDX_QRTZ_T_NEXT_FIRE_TIME` (`SCHED_NAME`,`NEXT_FIRE_TIME`),
KEY `IDX_QRTZ_T_NFT_ST` (`SCHED_NAME`,`TRIGGER_STATE`,`NEXT_FIRE_TIME`),
KEY `IDX_QRTZ_T_NFT_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`),
KEY `IDX_QRTZ_T_NFT_ST_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_STATE`),
KEY `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),
CONSTRAINT `QRTZ_TRIGGERS_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `QRTZ_JOB_DETAILS` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci |
序列化对象在JOB_DATA
Quartz文档说明了
JobDataMap可用于保存任意数量的(可序列化)数据 对象
http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-03.html
所以我的想法是,这可能是DB等问题,而不是石英,因为RAMJobStore工作正常?有什么想法吗?
我知道还有其他方法可以将对象传递给石英作业,例如它们可以工作。
SCHEDULER.getContext().put("buildingsModel", buildingsModel);
但是我不打算用@DisallowConcurrentExecution
运行石英,这可能意味着我可能会遇到并发作业的问题。通过JobDataMap传递数据可能是一种可行的方法(如果我可以使其工作,则进行测试)。另一种解决方案是只传递原始类型,但这又意味着我想要避免更多地加载到mysql。
答案 0 :(得分:0)
从十六进制字符串反序列化:(作业数据的格式为0xACED00057 ...删除“ 0x”)
ByteArrayInputStream bis = new ByteArrayInputStream(Hex.decodeHex(inputString));
ObjectInputStream ois = new ObjectInputStream(bis);
JobDataMap jobDataMap = (JobDataMap) ois.readObject();
Iterator keys = jobDataMap.keySet().iterator();
while (keys.hasNext()) {
StringBuffer buf = new StringBuffer();
String key = (String) keys.next();
buf.append(key).append("=");
Object value = jobDataMap.get(key);
buf.append(value);
/* output buf */
}