如何配置TestClusterBuilder使测试集群可访问SMSProvider?
解决Orleans测试集群找不到SMSProvider的问题
你碰到的KeyNotFoundException核心原因很明确:你只在Silo集群侧配置了SMSProvider,但客户端(Client)这边完全没注册这个Stream Provider。Orleans的Stream Provider要求Silo和Client两端都要配置一致的Provider,否则客户端根本不知道这个Provider的存在,自然会抛出找不到的错误。
下面是修复后的完整ClusterFixture代码,我添加了客户端的配置逻辑:
public class ClusterFixture : IDisposable { // Silo端的配置器,保留原有逻辑 private sealed class SiloConfigurator : ISiloBuilderConfigurator { public void Configure(ISiloHostBuilder siloBuilder) { siloBuilder.AddSimpleMessageStreamProvider("SMSProvider"); siloBuilder.AddMemoryGrainStorage("PubSubStore"); } } // 新增:客户端配置器,注册与Silo一致的SMSProvider private sealed class ClientConfigurator : IClientBuilderConfigurator { public void Configure(IConfiguration configuration, IClientBuilder clientBuilder) { clientBuilder.AddSimpleMessageStreamProvider("SMSProvider"); } } public ClusterFixture() { var builder = new TestClusterBuilder(); // 注册Silo配置器 builder.AddSiloBuilderConfigurator<SiloConfigurator>(); // 注册客户端配置器 builder.AddClientBuilderConfigurator<ClientConfigurator>(); this.Cluster = builder.Build(); this.Cluster.Deploy(); } public void Dispose() { this.Cluster.StopAllSilos(); } public TestCluster Cluster { get; private set; } }
为什么这能解决问题?
当你调用_cluster.Client.GetStreamProvider("SMSProvider")时,是在客户端层面请求这个Provider实例。如果客户端没有预先注册该Provider,Orleans客户端的服务容器中就没有对应的实例,必然会抛出找不到的异常。通过添加IClientBuilderConfigurator并在其中注册SMSProvider,客户端会与Silo端保持一致的配置,就能正常获取到这个Stream Provider了。
修改后再运行你的测试,KeyNotFoundException应该就会消失,你可以继续验证Stream的相关业务逻辑了。
内容的提问来源于stack exchange,提问作者DenLilleMand
相关产品推荐
相关产品推荐

