2016-04-26 14 views
0

私はしばらく実行していた古いトポロジを持っています。しかし、最近、私はこのトポロジーを更新して、それを殺す必要があります。私は嵐のために更新されたトポロジを提出しようとすると、このような例外が発生しました:ローカルクラスは暴風で互換性がありません

java.io.InvalidClassException: com.weibo.security.storm.bolt.IpCountBolt; local class incompatible: stream classdesc serialVersionUID = -5336119852024782309, local class serialVersionUID = -572783398581060861

だから、私はstorm.log.dirstorm.local.dir、ノード全体/storm中を含め、嵐のプロセスを殺したし、嵐に関連するすべてのものを削除しようとしました飼育係と/tmpディレクトリ全体が含まれます。しかし、私が嵐を開始し、トポロジーを再び提出すると、この例外はまだそこにあります。

トポロジでクラス名を変更してそれらをバイパスすることができましたが、これは適切な解決策ではありません。

私はそれがInvalidClassExceptionの原因となることを理解しています。しかし、私は古いトポロジに関連するすべてのデータを削除したと思います。なぜまだそこにいるのですか?古いトポロジのキャッシュを隠す可能性のある場所はどこにもありますか?

+0

クラスのソースは、シリアルバージョンの値を定義することもできます(ランダムなものを選択します)そうでない場合)と(2)あなたはどこかでクラスの新しいバージョンをピックアップしている可能性がありますか? –

+0

(1)いいえ、デフォルトでランダム値を使用しました。 (2)クラスの新しいバージョンを "ピックアップ"することはどういう意味ですか? –

答えて

0

問題は、serialVersionIDのデフォルト値です。変数serialVersionIDの値を宣言しないと、JVMはランダムな値を返します。 JVMに嵐が走っているなら、それぞれが独自の価値を生み出します。これは、逆シリアル化されたオブジェクトのserialVersionIDがローカルのjvmのクラスのserialVersionIDと一致する必要があるため、シリアル化された別のJVMでボルトを逆シリアル化するときに問題を引き起こします。

解決するには、そのクラスの変数を定義します。ソースがない場合は、serialVersionIDを宣言してサブクラスを作成する必要があります。

+0

あなたの答えは、JVM間でserialVersionIDが異なるため、トポロジが最初に失敗するということです。しかし、そうではありません。私は最初にそれを実行し、ボルトを交換して再度実行しようとするまでうまく動作しません。 –

関連する問題