2017-11-28 9 views
1

助けてもらえますか? 1〜2回保存するとうまく動作します。 3つ以上、私はこれを取得しています:イベントを再生するときの永続性の失敗... System.NotSupportedException:汎用IDictionaryはまだサポートされていません

[INFO][11/28/2017 2:57:27 PM][Thread 0005][[akka://ECHO3DEV/user/api-master/PortfolioCoordinator/TK#425630680]] Portfolio Actor: TK completely recovered. Current Positions: ...... 
11/28/2017 9:57:27 AM portfolio- Actor started... 
[ERROR][11/28/2017 2:57:27 PM][Thread 0005][[akka://ECHO3DEV/user/api-master/PortfolioCoordinator/TK/TK-IBM#1280277591]] **Persistence failure when replaying events for persistenceId [portfolio-TK-IBM]. **Last known sequence number [3] 
Cause: System.NotSupportedException: Generic IDictionary<TKey,TValue> are not yet supported**** 
    at Hyperion.SerializerFactories.DictionarySerializerFactory.<>c__DisplayClass3_0.<BuildSerializer>b__0(Stream stream, DeserializerSession session) 
    at Hyperion.ValueSerializers.ObjectSerializer.ReadValue(Stream stream, DeserializerSession session) 
    at lambda_method(Closure , Stream , DeserializerSession) 
    at Hyperion.ValueSerializers.ObjectSerializer.ReadValue(Stream stream, DeserializerSession session) 
    at lambda_method(Closure , Stream , DeserializerSession) 
    at Hyperion.ValueSerializers.ObjectSerializer.ReadValue(Stream stream, DeserializerSession session) 
    at lambda_method(Closure , Stream , DeserializerSession) 
    at Hyperion.ValueSerializers.ObjectSerializer.ReadValue(Stream stream, DeserializerSession session) 
    at Hyperion.SerializerFactories.DefaultDictionarySerializerFactory.<>c__DisplayClass3_0.<BuildSerializer>b__0(Stream stream, DeserializerSession session) 
    at Hyperion.ValueSerializers.ObjectSerializer.ReadValue(Stream stream, DeserializerSession session) 
    at lambda_method(Closure , Stream , DeserializerSession) 
    at Hyperion.ValueSerializers.ObjectSerializer.ReadValue(Stream stream, DeserializerSession session) 
    at lambda_method(Closure , Stream , DeserializerSession) 
    at Hyperion.ValueSerializers.ObjectSerializer.ReadValue(Stream stream, DeserializerSession session) 
    at Hyperion.Serializer.Deserialize[T](Stream stream) 
    at Akka.Serialization.HyperionSerializer.FromBinary(Byte[] bytes, Type type) 
    at Akka.Persistence.Sql.Common.Journal.AbstractQueryExecutor.ReadEvent(DbDataReader reader) 
    at Akka.Persistence.Sql.Common.Journal.AbstractQueryExecutor.<SelectByPersistenceIdAsync>d__44.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Akka.Persistence.Sql.Common.Journal.SqlJournal.<ReplayMessagesAsync>d__32.MoveNext() 

これをどのようにデバッグできますか?

+0

誰も助けることができますか? – tk1977tk

答えて

1

これはAkka.Persistence自体には問題ありません。バグ自体は、Hyperionシリアライザの中にあります。これは永続化(リモート処理のみ)には使用しないでください。結局のところ、あなたが保存しようとしているデータはあなたのものであり、自分自身のためにそれをどのように保存するかを制御しておく方が良いでしょう;)

これはAkka.Persistenceの一般的な間違いhere

Hyperionを永続性に使用する理由の1つは、まだベータ版であり、そのバイナリ形式が石で設定されていないということです。つまり、シリアライザをアップグレードした後は、イベントを読み戻すことができなくなる可能性があります。

この理由から、イベント用のよく知られたスキーマを持つシリアライザを明示的に定義する方がよいでしょう。自分のロールを決めることができます。具体的には、MsqPackまたはMicrosoft Bondを選択します。明示的なスキーマ定義で動作し、時間経過やイベントの内容の変更が容易になります。

カスタムシリアライザを定義するには、シリアライザを適用するシリアライザを認識するために、イベントをいくつかのタイプ(つまり空のインターフェイス)でマークする必要があります。そして、単にHOCON構成でシリアライザマッピングを定義します。

ここ
akka.actor { 
    serializers.msgpack= "Akka.Serialization.MessagePack.MsgPackSerializer, Akka.Serialization.MessagePack" 
    serialization-bindings { 
    "MyNamespace.IDomainEvent, MyAssembly" = msgpack 
    } 
} 

私はで私のイベントを認識するつもりカスタムインタフェースIDomainEventにAkka.NET MsgPackシリアライザを使用しています。タイプ認識のためには、アセンブリによる完全修飾型の名前が必要です。

+0

ありがとうございます! – tk1977tk

関連する問題