首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >石英jdbc序列化/反序列化对象

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

Stack Overflow用户
提问于 2018-01-26 17:16:18
回答 1查看 1.9K关注 0票数 1

在这个问题上,我无法使用JDBC使用石英JobDataMap反序列化对象。使用RAMJobStore的相同代码工作得很好。

我只是创建了一个用于测试的基本类。

代码语言:javascript
复制
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;
    }
}

然后在石英里

代码语言:javascript
复制
Test test = new Test();
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("test", test);

在石英工作中

代码语言:javascript
复制
JobDataMap data = context.getMergedJobDataMap();    
Test test = (Test) data.get("test");

我得到的例外是

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) java.lang.ClassCastException:不能将com.venclovas.quartz.buildings.Test转换为com.venclovas.quartz.buildings.Test

当我调试返回的对象时--在我看来,它看起来非常好(在转换之前)

DB定义

代码语言:javascript
复制
| 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中存储为blob。

石英文件说

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

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

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

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

代码语言:javascript
复制
SCHEDULER.getContext().put("buildingsModel", buildingsModel);

但是,我不打算使用@DisallowConcurrentExecution运行石英,这可能意味着我可能会遇到并发作业的麻烦。通过JobDataMap传递数据可能是一种方法(如果我能让它正常工作的话,需要进行测试)。另一种解决方案是只传递基本类型,但这同样意味着要向mysql加载更多的负载,这是我想要避免的。

EN

回答 1

Stack Overflow用户

发布于 2019-07-01 12:14:03

从十六进制反序列化:(使用0xACED 00057形式的作业数据.删除"0x")

代码语言:javascript
复制
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 */
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48466329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档