私のAsyncサービスは非常に異常な動作をしています。 物語: プラグインがあります。これはLead Create
で発生します。プラグイン自体の目的は、リードのカスタム列挙を作成することです。プラグインは、番号を保持するAutonumberingエンティティのフィールドから最後のnumerを取得します。次に、プラグインはAutonumberingエンティティの番号フィールドを1だけインクリメントし、取得した番号をLeadに割り当てます。非同期サービスエンティティを複数回処理します
問題は次のとおりです。 リードの大量生産(ナンバリングのクラッシュテスト)を実行すると、次のようになります。 400、Autonumberingカウンタは0から始まり、すべてのリードが処理されるとAutoneumberingカウンタは〜770の値で終了し、推定値は400を超えます。
非同期サービスは同じリードを複数回処理します。いくつかの場合は1回だけ、他の場合は2〜5回です。
これはどうしてですか?彼らは複数のスレッドのためのインスタンスを使用することができるよう まず私のコンテキスト・ファクトリー・サービス変数は、クラス内で宣言された:1
public void Execute(IServiceProvider serviceProvider)
{
Entity target = ((Entity)context.InputParameters["Target"]);
target["new_id"] = GetCurrentNumber(service, LEAD_AUTONUMBER);
service.Update(target);
return;
}
public int GetCurrentNumber(IOrganizationService service, Guid EntityType)
{
lock (_locker)
{
Entity record = service.Retrieve("new_autonumbering", EntityType, new ColumnSet("new_nextnumber"));
record["new_nextnumber"] = int.Parse(record["new_nextnumber"].ToString()) + 1;
service.Update(record);
return int.Parse(record["new_nextnumber"].ToString());
}
}
UPDATE:
は、ここに私のコードです。
public class IdAssignerPlugin : IPlugin
{
private static IPluginExecutionContext context;
private static IOrganizationServiceFactory factory;
private static IOrganizationService service;
public void Execute(IServiceProvider serviceProvider)
{
context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
service = factory.CreateOrganizationService(null);
[...]
}
}
@HenkvanBoeijenのコメント後、私は、これは安全な方法ではないことに気づいたので、私はExecute()
メソッドにすべての宣言を移動しました。
public class IdAssignerPlugin : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));;
IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));;
IOrganizationService service = factory.CreateOrganizationService(null);;
[...]
}
}
しかし、処理は、今非常に急速に行くが、これは、複数の処理から私を救っていません。
UPDATE 2:私も
など、状況Retry Count = 0
と11回の操作後、残りの操作はRetry Count = 1
を持っており、16の後にそれがRetry Count = 2
であることに気づいたシステムジョブでは(このテストでは、私は20点のリードを作成しましたprogrammaticaly、およびassigment後にカウンタは私last number = 33
を示しており、私はすべてのretry count
値をまとめる場合には、自動番号でlast number
に似ていた、33で出てくる)
'context'と' service'から来るのか?あなたのコードはスレッドセーフではないようです。 –
@HenkvanBoeijen、私は質問の更新1に答えました。 –
再試行は、おそらくロックを取得してスキップするためのワークフローであるため、ロックを取得するためにワークフローが待機するように、Thread.Sleepで再試行する必要があります。 – dynamicallyCRM