0

我有一个 QuartzJobBean 扩展,它接受两个参数:

public class FileListProcessorJob extends QuartzJobBean
{
  transient static final Logger logger = Logger.getLogger(FileListProcessorJob.class);
  FileListProcessor fileProcessor;  // with setter
  FileListProcessor fileProcessor2;  // with setter

// ...
}

我在这个应用程序中有 4 个使用这个 bean 的石英作业;这是我处理文件夹中的一组文件,然后处理另一组文件的次数。

它在我的测试环境中运行良好,但是当我将它移到开发环境时,我不得不为数据库数据源配置 Quartz,因为它要在集群中工作。当我这样做时,运行时开始告诉我“fileProcessor”不可序列化。我试图使它可序列化,但消息仍然存在。

fileProcessor下加载了三个不同的bean类和四个不同的bean;我已经检查了所有这些以确保它们是可序列化的,但消息仍然出现。该消息似乎还表明 log4j Logger 是不可序列化的实体,但我看不出它是怎么回事。我一口气把它变成了瞬态,没有区别。

我在 SO 和其他地方发现的可序列化问题的标准答案涉及将作业 bean 中的调用移动到作业执行上下文,通过 SchedulerContextAsMap 传递引用。但是,据我所知,这取决于具有全局唯一名称的参数,以加载全局唯一 bean 名称,这在我设置时不起作用。我重新使用了参数,因为我重新使用了 bean 本身。

我是 Spring 设计的新手,但我认为这是它应该工作的方式 - 可重用组件,使用 XML 配置以避免对类似的类进行稍微修改以执行不同的操作。那么我怎样才能让我的 4 份工作发挥作用呢?我是否必须复制并粘贴它们,然后稍微修改名称以使它们不同,并且在配置中是唯一的?还是我缺少其他一些可以在这里使用的部分?

4

1 回答 1

0

有两个层面的问题需要解决;让某些东西被序列化需要对代码进行一些艰苦的检查和更改,并且集群环境将 bean 的序列化形式写入数据库,然后优先使用它们(或代替或补充,我不确定)弹簧/石英配置文件。一旦我完成了所有必要的序列化,并擦除了存储在那里的所有作业的数据库记录,它就更像我预期的那样工作了。

于 2013-07-19T15:46:02.140 回答