Появление акторов в RunAsync создает "Интерфейсный идентификатор" 1830616258 "не реализован объектом" CustomActorService.InternalCustomActorService ""
Я следую совету в Service Fabric SpawnActor при запуске для порождения пары актеров при запуске сервиса. У меня есть пользовательский подкласс ActorService со следующим переопределением RunAsync:
internal sealed class InternalCustomActorService : ActorService
{
protected async override Task RunAsync(CancellationToken cancellationToken)
{
await base.RunAsync(cancellationToken);
for(int i = 0; i < 10; i++)
{
ICustomActor proxy = ActorProxy.Create<ICustomActor>(new ActorId(i));
await proxy.StartAsync();
}
}
...
Класс зарегистрирован в Program.cs следующим образом:
ActorRuntime.RegisterActorAsync<CustomActor>(
(context, actorType) => new InternalCustomActorService(context, actorType, () => new CustomActor())).GetAwaiter().GetResult();
Тем не менее, я получаю следующее исключение вызова proxy.StartAsync()
метод:
FatalExecutionEngineError occurred
HResult=-2146233088
Message=One or more errors occurred.
Source=Microsoft.ServiceFabric.Services
StackTrace:
at Microsoft.ServiceFabric.Services.Communication.Client.ServicePartitionClient`1.<InvokeWithRetryAsync>d__7`1.MoveNext()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.ServiceFabric.Services.Remoting.Client.ServiceRemotingPartitionClient.<InvokeAsync>d__8.MoveNext()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.ServiceFabric.Services.Remoting.Builder.ProxyBase.<InvokeAsync>d__0.MoveNext()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.ServiceFabric.Services.Remoting.Builder.ProxyBase.<ContinueWith>d__b.MoveNext()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at CustomActorService.InternalCustomActorService.<RunAsync>d__2.MoveNext() in C:\_data\Master\CONSTABLE2\Apps\BSP\Research\ServiceFabric\CustomActorServiceApp\CustomActorService\InternalCustomActorService.cs:line 47
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.ServiceFabric.Services.Runtime.StatefulServiceReplicaAdapter.<ExecuteRunAsync>d__e.MoveNext()
InnerException:
HResult=-2147467263
Message=Interface id '1830616258' is not implemented by object 'CustomActorService.InternalCustomActorService'
Source=Microsoft.ServiceFabric.Services
InnerException:
Пример проекта находится на GitHub здесь https://github.com/PaloMraz/CustomActorServiceApp
У меня вопрос: что я делаю не так?
РЕДАКТИРОВАТЬ: я попытался добавить дополнительные BootstrapperService
служба без гражданства и порождение актеров оттуда в BootstrapperService.RunAsync
:
protected override async Task RunAsync(CancellationToken cancellationToken)
{
await base.RunAsync(cancellationToken);
await Task.Delay(10000);
for (int i = 0; i < 10; i++)
{
ICustomActor proxy = ActorProxy.Create<ICustomActor>(new ActorId(i));
await proxy.StartAsync();
}
}
Тем не менее, призыв к proxy.StartAsync()
throws the exact same exception as from within the InternalCustomActorService.RunAsync
выше.
1 ответ
Удалите следующий код из вашей пользовательской службы актеров:
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
var remotingListener = new ServiceReplicaListener(context => this.CreateServiceRemotingListener(context));
return new ServiceReplicaListener[] { remotingListener };
}
Это удаляет ActorRemotingListener, который настраивает базовый ActorService. Если вы хотите добавить дополнительный прослушиватель, вызовите базовый метод CreateServiceReplicaListeners, получите прослушиватели, а затем добавьте настраиваемый прослушиватель.