我有一个 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 份工作发挥作用呢?我是否必须复制并粘贴它们,然后稍微修改名称以使它们不同,并且在配置中是唯一的?还是我缺少其他一些可以在这里使用的部分?