自定义Akka.NET Transport连接失败问题排查
问题
我正在尝试实现自定义Akka.NET Transport,已编写客户端、服务端、消息类、桩代码形式的关联事件监听器MyAel及自定义Transport类MyTransport。此前使用TCP的同类客户端/服务端配置可正常运行,但使用自定义Transport时,服务端启动正常,客户端启动后触发错误:
[ERROR][9/27/2022 3:50:49 PM][Thread 0009][akka://MyActorSystem/user/$a] No transport is loaded for protocol: [akka.myproto], available protocols: [akka.] Cause: Akka.Remote.RemoteTransportException: No transport is loaded for protocol: [akka.myproto], available protocols: [akka.] at Akka.Remote.Remoting.LocalAddressForRemote(IDictionary`2 transportMapping, Address remote) at Akka.Remote.RemoteActorRefProvider.RootGuardianAt(Address address) at Akka.Actor.ActorRefFactoryShared.ActorSelection(String path, ActorSystem system, IActorRef lookupRoot) at AkkaTest.SendActor.<>c.<.ctor>b__0_0(StartRemoting s) in ...\AkkaTest\AkkaTest\Program.cs:line 44 at lambda_method7(Closure , Object , Action`1 , Action`1 ) at Akka.Actor.ReceiveActor.OnReceive(Object message) at Akka.Actor.UntypedActor.Receive(Object message) at Akka.Actor.ActorBase.AroundReceive(Receive receive, Object message) at Akka.Actor.ActorCell.ReceiveMessage(Object message) at Akka.Actor.ActorCell.Invoke(Envelope envelope)
无论服务端是否启动,客户端均出现该问题,怀疑是桩代码缺失实现,但文档资料有限,目前未触发任何NotImplementedExceptions,请问当前阶段遗漏了什么?
解决思路
- 未在HOCON配置中注册自定义Transport:Akka.NET不会自动发现自定义Transport,必须在配置中明确指定加载你的
MyTransport类型,并绑定对应的协议。示例配置:
akka.remote { enabled-transports = ["akka.remote.myproto"] myproto { transport-class = "你的程序集命名空间.MyTransport, 你的程序集名称" applied-adapters = [] transport-protocol = "akka.myproto" } }
- 未实现
ISchemeAssociation接口:自定义Transport类必须实现Akka.Remote.Transport.ISchemeAssociation接口,并重写Scheme属性返回协议名称akka.myproto。Akka.Remoting通过这个接口关联协议与Transport实例,缺失会导致系统无法识别对应协议。 - Transport构造函数不符合要求:
MyTransport需要提供一个接受ExtendedActorSystem和Config两个参数的构造函数——Akka.NET通过反射实例化Transport,参数不匹配会导致加载失败,但不会抛出NotImplementedException。 - 事件监听器未正确绑定:如果
MyAel是Transport依赖的事件处理组件,需要在MyTransport的初始化逻辑中将其注册,否则Transport无法处理通信事件,也可能间接导致协议无法被正常识别。
内容的提问来源于stack exchange,提问作者Bondolin
相关产品推荐
相关产品推荐

