0

2 つのパラメーターを取る QuartzJobBean の拡張機能があります。

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

// ...
}

このアプリケーションには、この Bean を使用する 4 つの Quartz ジョブがあります。それは、フォルダーから一連のファイルを処理してから、別のセットを処理する回数です。

私のテスト環境では問題なく動作しますが、開発環境に移したとき、クラスターで動作するため、データベース データソース用に Quartz を構成する必要がありました。私がそれをしたとき、ランタイムは「fileProcessor」がシリアライズ可能ではないことを教え始めました。シリアライズ可能にしようとしましたが、メッセージはまだ残っています。

fileProcessor の下にロードされる 3 つの異なる Bean クラスと 4 つの異なる Bean があります。それらがシリアライズ可能であることを確認するためにそれらすべてを調べましたが、メッセージは引き続き表示されます。このメッセージは、log4j Logger がシリアル化できないエンティティであることも示しているように見えますが、それがどのようになっているのかわかりません。1回のパスで一時的にしましたが、違いはありません。

私が SO などで見つけたシリアライズ可能な問題に対する標準的な回答には、ジョブ Bean 内での呼び出しをジョブ実行コンテキストに移動し、SchedulerContextAsMap を介して参照を渡すことが含まれます。しかし、私が知る限り、これは、グローバルに一意の Bean 名をロードするパラメーターのグローバルに一意の名前を持つことに依存しています。Bean 自体を再利用するので、パラメーターを再利用します。

私はSpringの設計は初めてですが、これが機能するはずの方法だと思いました.XMLで構成された再利用可能なコンポーネントで、同様のクラスが異なることを行うためにわずかに変更されることはありません。では、どうすれば4つの仕事を機能させることができますか? それらをコピーして貼り付けてから、名前を少し変更して、構成内で異なり、一意になるようにする必要がありますか? または、私が行方不明で、ここで使用できる他の部分がありますか?

4

1 に答える 1

0

解決すべき問題には 2 つのレベルがありました。何かをシリアル化するには、骨の折れる検査とコードの変更が必要です。クラスター化された環境では、シリアル化された形式の Bean がデータベースに書き込まれ、それらを優先して (または代わりに、または追加して、よくわかりません) 使用します。 spring/quartz 構成ファイル。シリアライゼーションに必要なすべての作業を完了し、そこに保存されていたすべてのジョブのデータベース レコードを消去すると、期待どおりに機能しました。

于 2013-07-19T15:46:02.140 に答える