大量のデータを処理するために BillingCenter Guidewire でワークキューを作成しましたが、一部のレコードに対してデータベースが「Database bean version conflict :」という例外を返しました。
誰かが私を助けることができますか?
ワーカーが競合するプロセスを記録しないように制御するにはどうすればよいですか?
よろしく、 ダグラス・レゼンデ
この例外は、エンティティがバージョン管理可能で、2 つのプロセスが同じ「レコード」を変更している場合に発生します。WorkQueue の findTargets メソッドにコントロールを追加する必要があると思います。最後の実行が完了する前に、WorkQueue の新しいインスタンスが実行されている可能性があります。
private var _lock : ReentrantLock = new ReentrantLock()
private final static var _batchProcessType = BatchProcessType.TC_JOBEXPIRE
override function findTargets(): Iterator<PolicyPeriod> {
using( _lock ) {
var maintenanceToolsAPI = new gw.webservice.pc.pc800.MaintenanceToolsAPI()
if (!maintenanceToolsAPI?.getWQueueStatus(_batchProcessType.Code)?.NumActiveWorkItems != 0) {
// ...
}
return {}.iterator() as Iterator<PolicyPeriod>
}
}
そのようにして、アクティブなアイテムで 1 つの実行が存在しないことを検証します。