2016-12-13 6 views
1

複数のノードの更新を行っていて、プログラムでノードを公開するためにコマンド "Activate"を使用してバッチを公開(大量のデータ)しますが、時々間違いがあります。これまで何度か起こっただけなので、問題を引き起こしているものが何であるか把握することは難しいです。発行時にactivationStatusが外部で変更されました

ここにエラーがスローされます。

Caused by: org.apache.jackrabbit.core.state.StaleItemStateException: 8b3ce2d4-eb7b-4838-901c-413aa9eeee84/{http://www.magnolia.info/jcr/mgnl}activationStatus has been modified externally 
    at org.apache.jackrabbit.core.ItemSaveOperation.removeTransientItems(ItemSaveOperation.java:723) 
    at org.apache.jackrabbit.core.ItemSaveOperation.perform(ItemSaveOperation.java:228) 

誰かに似た問題が発生しましたか?あるいは、この問題をどこから見なければならないのでしょうか?

ありがとうございます! :)

+0

私は非同期コマンドを使用していると仮定しているため、他の1つが大文字と小文字を処理するまで状態を変更する可能性があります。これをプログラムで行うなら、私はそれがいくつかのThread.sleep()の間にあるのに役立つかどうかを試してみることをお勧めします。問題が本当にタイミングであれば、私たちは操作が完了した時等にリッスンなど何かをすることができます – Ducaz035

+0

こんにちは@ Ducaz035、このコマンドは非同期ですか?私はこれを実行しています: コマンドcmd =((CommandsManager)Components.getComponent(CommandsManager.class))。getCommand( ""、 "activate"); コンテキストctx =新しいSimpleContext(); マップparams = new HashMap <>(); params.put( "repository"、workspaceName); params.put( "uuid"、uuid); params.put( "recursive"、true); ctx.putAll(params); cmd.execute(ctx); –

+0

また、実際に何が起こったのかよく分かりません。 activationStatusが外部的に変更されているのはなぜですか?著者インスタンスは1つしかなく、誰もパブリックインスタンスに触れていません。これが起こる可能性があるケースを説明するのに役立つことができますか?どうもありがとう! –

答えて

1

基本的に動作を更新すると、Magnoliaは起動状態を修正します(これは正しい)。この操作が進行中であれば、更新操作が引き継ぎ状態を変更しようとしています。この場合、あなたが不運な場合は、あなたが持っている例外を打つかもしれません。その理由は、これらのコマンドは非同期で実行されますが、同じノードに接触するということです。

潜在的な解決策:

1)あなたは、単に後の第二1を完了し、実行するための最初の操作のためにいくつかの時間を与えることができます。

2)これは、いくつかの開発努力を必要とするが、ここで私達は行く:

あなたが最初の操作によって使用されているノードをロックし、操作が完全に実行されたときに、ロックを解除しLockManagerを使用することができます。一方、第2の動作は、ノードがロックされているかどうかをチェックし、yesの場合は続行せず、第1のプロセスからロックが解除されるまで待機する。

+0

Okありがとう!私は最初のものを試してみる。ありがとう! :) –

関連する問題