当前位置: 首页 > 知识库问答 >
问题:

石英jdbc序列化/反序列化对象

郑翰海
2023-03-14

我遇到了这个问题,无法使用JDBC使用quartz 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);

在石英行业

JobDataMap data = context.getMergedJobDataMap();    
Test test = (Test) data.get("test");

我得到的例外是这个

JAVAlang.ClassCastException:com。文克洛瓦斯。石英建筑。无法将测试转换为com。文克洛瓦斯。石英建筑。在com上测试。文克洛瓦斯。石英建筑。建筑升级工作。在org上执行(BuildingsUpgradeJob.java:39)。石英果心JobRunShell。在org上运行(JobRunShell.java:202)。石英简单。SimpleThreadPool$WorkerThread。运行(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 |

序列化对象作为blob存储在JOB\u数据中

Quartz文件指出

JobDataMap可以用来保存任意数量的(可序列化的)数据对象

http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-03.html

所以我的想法是,也许这是DB etc的问题,而不是石英的问题,因为RAMJobStore工作正常?有什么想法吗?

我知道还有其他方法可以将对象传递给quartz作业,它们也可以工作,例如。

SCHEDULER.getContext().put("buildingsModel", buildingsModel);

但是我不打算使用@DisalloCon电流执行运行石英,这可能意味着我可能会遇到并发作业的麻烦。通过JobDataMap传递数据可能是一种方法(如果我能让它工作,就要测试)。另一个解决方案是只传递基元类型,但这也意味着我想避免给mysql带来更多的负载。

共有1个答案

宣星光
2023-03-14

从hexstring进行反序列化:(作业数据格式为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 */
 }
 类似资料:
  • 本文向大家介绍java对象的序列化和反序列化,包括了java对象的序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java对象的序列化和反序列化,供大家参考,具体内容如下 1. 什么是序列化        将对象转换为字节流保存起来,比如保存到文件里,并在以后还原这个对象,这种机制叫做对象序列化。(补充一句:把对象保存到永久存储设备上称为持久化) 2. 怎么实现序列化

  • 我已经开始将一个项目从使用Java标准日期迁移到Joda DateTime。 我的项目使用XML序列化将对象保存到XML文件中。在这个特殊的例子中,我有一个Item类,它有一个DateTime属性。 在某个时候,我正在初始化对象,包括像这样的DateTime属性: 我使用XMLEncoder使用辅助类序列化项目: 显然,日期时间被保存在xml中。。。但毫无价值: 显然,它没有保存任何东西,但不,它

  • 我正在尝试使用kryo序列化和反序列化到二进制。我想我已经完成了序列化,但似乎无法反序列化。下面是我正在处理的代码,但最终我想存储一个字节[],然后再次读取它。文档只显示了如何使用文件。

  • 错误: java.lang.ClassNotFoundException:testprocedure.tp$3在java.net.URLClassLoader$1上运行(未知源)在java.net.URLClassLoader上运行(未知源)在java.security.accessController.doprivileged(本机方法)在java.net.URLClassLoader.find

  • 本文向大家介绍详解Java 对象序列化和反序列化,包括了详解Java 对象序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反。在我们看来这种行为实在是繁琐,尤其是在这个对象中属性值很多的时候。基于此,Java中对象的序列