2016-10-21 4 views
2

私は1つのサービスファブリックアクターサービスを持っています。これにより、ActorServiceActorService.Interfacesの2つのプロジェクトが作成されます。サービスファブリック内の1つのActorRuntime内に2つのアクターを登録できません。

ActorService.Interfacesには、ルートアクター(IRootActor)のインターフェイスが含まれています。 ActorService自体には、RootActorIChildActorChildActorが含まれています。どちらのインターフェイスもIActorを実装しており、両方のクラスがActorを継承し、それぞれのインターフェイスを実装しています。

ActorRuntime.RegisterActorAsync<ChildActor>(
    (context, actorType) => new ActorService(context, actorType,() => container.Resolve<ChildActor>())) 
    .GetAwaiter() 
    .GetResult(); 

ActorRuntime.RegisterActorAsync<RootActor>(
    (context, actorType) => new ActorService(context, actorType,() => container.Resolve<RootActor.Factory>()(context))) 
    .GetAwaiter() 
    .GetResult(); 

Thread.Sleep(Timeout.Infinite); 

container.Resolve<RootActor.Factory>()(context)戻りRootActorインスタンスへの呼び出し:私はこのようなProgram.csの内からこれらの俳優を登録します。

私は

IRootActory proxy = ActorProxy.Create<IRootActor>(new ActorId(id), actorServiceUri); 
proxy.Method(data); 

呼び出すとすべてがうまく行きます。前述のRootActor.Method方法は、単一のループで2つのことを行い子役を作成し、それが法だ呼び出す:

IChildActor proxy = ActorProxy.Create<IChildActor>(new ActorId(otherId), sameActorServiceUri); 
proxy.OtherMethod(transformedData); 

そしてここで問題にしています。 proxy.OtherMethodコールされると、基本的にこの野生の例外が表示されます:

HRESULT = -2146232969 メッセージ=いいえMethodDispatcherインターフェイス ID '230348154' ソースのために発見された= Microsoft.ServiceFabric.Actors

は私がやっていますここに何か間違っている?私はthis SO threadを考慮して、1つのサービスから2人の俳優を作ることができると考えました...

答えて

2

さて、私はそれを理解しました。そこでは苦労している人のために、問題は俳優のサービスURIにあった。 私は両方のアクターがサービスURIを共有していると誤って想定しています。 the link I mentioned in the questionに記載されているように、俳優たちは実際に別々にホストされます。 ServiceManifest.xmlを見てみると、という名前の2つのExtension xmlノードがあります。子に準じたサービス名部分を変更するだけです。DefaultService xmlノードです。したがって、この例ではおそらくChildActorServiceとなります。まあ、それは非常に不都合なように聞こえる。

サービスファブリックの設定と構成は、複雑なものになります。しかし、VSはあなたを助けるのが最善です。時々あなたはそれを期待していなくても、本質的に悪の根源になっています。あなたが何を探すべきか分からなければ、あなたはそれを探しません。

1

ActorProxyを使用してアクターに接続している間、アクターは正常に登録されています。サービス名を指定する場合は、正しいサービス名を指定する必要があります。代わりにサービス名を省略してApplciationNameを指定することができ、Actor FrameworkはActorの正しいサービス名を特定します。を参照してくださいhttps://msdn.microsoft.com/en-us/library/azure/mt694503.aspx

+0

名前を不明確にすることについてのコメントはありませんか?あなたが投稿したリンクは、その名前がアクタが実装するインタフェースから派生したものだと言いますが、アクタがより多くのインタフェースを実装すると推論することはできません。 – netchkin

関連する問題