为什么消息中的多个构造函数会导致 Akka.NET 传递失败?
Why do multiple constructors in messages cause Akka.NET to fail delivery?
我使用 Akka.NET 远程处理实现了一个非常简单的实现。
具体来说我有两个演员:
public class ClientQueryActor : ReceiveActor
{
public ClientQueryActor(ActorSelection stockBarcodeActor)
{
this._stockBarcodeActor = stockBarcodeActor ?? throw new ArgumentNullException("stockBarcodeActor must be provided.");
this.Receive<GetStockBarcodeByBarcodeRequest>(this.HandleStockBarcodeByBarcodeRequestReceived);
this.Receive<GetStockBarcodeByBarcodeResponse>(this.HandleStockBarcodeByBarcodeResponseReceived);
}
private void HandleStockBarcodeByBarcodeRequestReceived(GetStockBarcodeByBarcodeRequest obj)
{
this._stockBarcodeActor.Tell(obj);
}
private void HandleStockBarcodeByBarcodeResponseReceived(GetStockBarcodeByBarcodeResponse obj)
{
}
}
public class StockBarcodeQueryActor : ReceiveActor
{
public StockBarcodeQueryActor()
{
this.Receive<GetStockBarcodeByBarcodeRequest>(this.HandleStockBarcodeByBarcodeRequestReceived);
}
private void HandleStockBarcodeByBarcodeRequestReceived(GetStockBarcodeByBarcodeRequest obj)
{
this.Sender.Tell(new GetStockBarcodeByBarcodeResponse(true, null, null));
}
}
在大多数情况下,这些参与者似乎工作正常,问题出在我发送的消息中。
我的消息 class 大致如下所示:
public class GetStockBarcodeByBarcodeResponse
{
public GetStockBarcodeByBarcodeResponse(bool success) { }
public GetStockBarcodeByBarcodeResponse(bool success, IEnumerable<string> errors) { }
}
但是,当我尝试使用此 class 发送消息时,出现错误
'Association with remote system akka.tcp://client@localhost:2552 has
failed; address is now gated for 5000 ms. Reason is:
[Akka.Remote.EndpointDisassociatedException: Disassociated'
当我删除多个构造函数时,消息发送成功。
我在文档中找不到任何引用此问题的内容,有人可以向我解释一下这个限制吗?
任何人都可以提供任何建议的解决方法吗?
Bartosz 的评论是正确的答案 - 我们默认对用户定义的消息使用 JSON.NET 序列化,为了使反序列化工作,您需要使用 JsonConstructor
属性标记其中一个构造函数: Unable to deserialize classes with multiple constructors with Json.NET
我使用 Akka.NET 远程处理实现了一个非常简单的实现。
具体来说我有两个演员:
public class ClientQueryActor : ReceiveActor
{
public ClientQueryActor(ActorSelection stockBarcodeActor)
{
this._stockBarcodeActor = stockBarcodeActor ?? throw new ArgumentNullException("stockBarcodeActor must be provided.");
this.Receive<GetStockBarcodeByBarcodeRequest>(this.HandleStockBarcodeByBarcodeRequestReceived);
this.Receive<GetStockBarcodeByBarcodeResponse>(this.HandleStockBarcodeByBarcodeResponseReceived);
}
private void HandleStockBarcodeByBarcodeRequestReceived(GetStockBarcodeByBarcodeRequest obj)
{
this._stockBarcodeActor.Tell(obj);
}
private void HandleStockBarcodeByBarcodeResponseReceived(GetStockBarcodeByBarcodeResponse obj)
{
}
}
public class StockBarcodeQueryActor : ReceiveActor
{
public StockBarcodeQueryActor()
{
this.Receive<GetStockBarcodeByBarcodeRequest>(this.HandleStockBarcodeByBarcodeRequestReceived);
}
private void HandleStockBarcodeByBarcodeRequestReceived(GetStockBarcodeByBarcodeRequest obj)
{
this.Sender.Tell(new GetStockBarcodeByBarcodeResponse(true, null, null));
}
}
在大多数情况下,这些参与者似乎工作正常,问题出在我发送的消息中。
我的消息 class 大致如下所示:
public class GetStockBarcodeByBarcodeResponse
{
public GetStockBarcodeByBarcodeResponse(bool success) { }
public GetStockBarcodeByBarcodeResponse(bool success, IEnumerable<string> errors) { }
}
但是,当我尝试使用此 class 发送消息时,出现错误
'Association with remote system akka.tcp://client@localhost:2552 has failed; address is now gated for 5000 ms. Reason is: [Akka.Remote.EndpointDisassociatedException: Disassociated'
当我删除多个构造函数时,消息发送成功。
我在文档中找不到任何引用此问题的内容,有人可以向我解释一下这个限制吗?
任何人都可以提供任何建议的解决方法吗?
Bartosz 的评论是正确的答案 - 我们默认对用户定义的消息使用 JSON.NET 序列化,为了使反序列化工作,您需要使用 JsonConstructor
属性标记其中一个构造函数: Unable to deserialize classes with multiple constructors with Json.NET