When I batch delete documents and all the documents are deleted at the same thread.
So that means the private variable "NsbrUnsentDelDocSnapshotKey" value will be overwrite by the last document that apply the "AfterDelete".
So the value of "NsbrUnsentDelDocSnapshotKey" in the "AfterCommit" will always the same which is not correct.
so how can pass value between trigger methods.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
public class SendCommandForDocumentDeleteTrigger : AbstractDeleteTrigger,IDisposable
{
private static Logger logger = NLog.LogManager.GetCurrentClassLogger();
private ThreadLocal<RavenJObject> DeletingDocMetaData = new ThreadLocal<RavenJObject>();
private ThreadLocal<string> NsbrUnsentDelDocSnapshotKey = new ThreadLocal<string>();
public override void OnDelete(string key, Raven.Abstractions.Data.TransactionInformation transactionInformation)
{
var doc = Database.Get(key,transactionInformation);
if (doc != null)
{
DeletingDocMetaData.Value = doc.Metadata;
}
base.OnDelete(key, transactionInformation);
}
public override void AfterDelete(string key, TransactionInformation transactionInformation)
{
if (!MessageDefinition.IsSystemDocument(key) && DeletingDocMetaData!=null)
{
if (TriggerHelper.UseRobustWayToCatchUnsentMessage(Database))
{
NsbrUnsentDelDocSnapshotKey.Value = RavenConstant.NsbrUnsentDocumentSnapshotKeyPrefix + Guid.NewGuid();
StoreFailedSendingMessage(NsbrUnsentDelDocSnapshotKey.Value, key, DeletingDocMetaData.Value, transactionInformation);
}
}
base.AfterDelete(key, transactionInformation);
}
public override void AfterCommit(string key)
{
if (MessageDefinition.IsSystemDocument(key))
{
return;
}
if (DeletingDocMetaData==null)
{
return;
}
try
{
var replicationSourceInfoJson = ReplicationHelper.CreateReplicationSourceJson(GlobalBus.HostName,
Database.Name, "");
var message = new DeleteDocument
{
Key = key,
ReplicationSourceInfoJson = replicationSourceInfoJson,
MetadataJsonString = DeletingDocMetaData.ToString()
};
GlobalBus.Bus.Send(message);
if (TriggerHelper.UseRobustWayToCatchUnsentMessage(Database))
{
Database.Delete(NsbrUnsentDelDocSnapshotKey.Value, null, null);
}
}
catch (Exception e)
{
if (!TriggerHelper.UseRobustWayToCatchUnsentMessage(Database))
{
var snapshotkey= RavenConstant.NsbrUnsentDocumentSnapshotKeyPrefix + Guid.NewGuid();
try
{
StoreFailedSendingMessage(snapshotkey, key, DeletingDocMetaData.Value);
}
catch (Exception ex)
{
logger.Fatal("Store DeleteDocument Error:({0}-snapshotkey={1}) {2}", key,snapshotkey, ex);
}
}
logger.FatalException("SendCommandForDocumentDeleteTrigger Error", e);
}
}
private void StoreFailedSendingMessage(string snapshortkey ,string key,RavenJObject deleteMetadata,
TransactionInformation transactionInformation = null)
{
var ravenJObject =
RavenJObject.FromObject(new NsbrUnsentDocumentSnapshot
{
Key = key,
ActionType = RavenConstant.NsbrUnsentMessageActionTypeDelete,
SourceDb = Database.Name,
SourceHost = GlobalBus.HostName,
Metadata = deleteMetadata.ToString()
}
);
var metadata = new RavenJObject()
{
{Constants.RavenEntityName,RavenJToken.FromObject(RavenConstant.NsbrUnsentDocumentSnapshotKeyPrefix.TrimEnd('/'))}
};
Database.Put(snapshortkey, null, ravenJObject, metadata, transactionInformation);
}
public void Dispose()
{
if (DeletingDocMetaData != null)
{
DeletingDocMetaData.Dispose();
}
if (NsbrUnsentDelDocSnapshotKey != null)
{
NsbrUnsentDelDocSnapshotKey.Dispose();
}
}
}