私はAzure Service Fabricでアクターサービスを作成しています。 Azureにデプロイすると、最初はうまくいくようです。テキストを追加して返すことができます(アクターにはWeb APIがあります)が、アイドル状態になるとGetTextsAsyncは空のコレクションを返します。アクターの状態が失われるのはなぜですか?
EDIT: 追加する前に状態が存在するかどうかを確認するコードを更新しましたが、問題は解決しません。
[StatePersistence(StatePersistence.Persisted)]
public class TextActor : Actor, ITextActor
{
protected override async Task OnAactivateAsync()
{
if(!await StateManager.ContainsStateAsync("State"))
{
await this.StateManager.TryAddStateAsync<List<string>>("State", new List<string>());
}
}
public async Task AddTextAsync(string text)
{
var texts = await this.StateManager.GetStateAsync<List<string>>("State");
texts.Add(text);
await this.StateManager.SetStateAsync("State", texts);
}
public async Task<List<string>> GetTextsAsync()
{
return await this.StateManager.GetStateAsync<List<string>>("State");
}
}
はEDIT2: 俳優自身が交換されたかのように思われます。 ActorIdを返すようにアクタを修正し、テキストのリストが消えると、ActorIdも新しいものに置き換えられました。
私はVoiceMailBoxサンプルのパターンに従っています。アクターはコントローラー内で静的に作成されています。それは問題ですか?
public class TextsController : ApiController
{
private static Uri serviceUri = new Uri("fabric:/TextApp/TextActorService");
private static ActorId actorId = ActorId.CreateRandom();
private static ITextActor textActor = ActorProxy.Create<ITextActor>(actorId, serviceUri);
[HttpGet]
public async Task<IHttpActionResult> GetTexts()
{
var texts = await textActor.GetTextsAsync();
return Ok(texts);
}
//Methods omitted
}
Re Edit 2: 'private static ActorId actorId = ActorId.CreateRandom();'という行は悪い考えです。 WebApiステートレスサービスの各インスタンスは、異なる「ActorId」で終了します。 1つのインスタンスしか持たない場合でも、インスタンスを再起動する場合、置換インスタンスは 'textActor'に対して異なる' ActorId'を持ちます。定数 'ActorId'を使用して問題が解決するかどうかを確認します。 'private static ActorId actorId = new ActorId(0);' –
@NickBarrettのようなものが私の主な問題でした。 – Landrew