0

我想要完成的只是:在同一个 AppDomain 中运行 Silo 和 Client

使用奥尔良的教程一切都很顺利:

static void Main(string[] args)
{
    AppDomain hostDomain = AppDomain.CreateDomain("OrleansHost", null,
        new AppDomainSetup()
        {
            AppDomainInitializer = InitSilo
        });

    DoSomeClientWork();

    hostDomain.DoCallBack(ShutdownSilo);
}

static void InitSilo(string[] args)
{
    siloHost = new SiloHost(System.Net.Dns.GetHostName())
    {
        ConfigFileName = "SiloConfiguration.xml"
    };

    siloHost.InitializeOrleansSilo();
    var startedok = siloHost.StartOrleansSilo(); //Works perfectly
    if (!startedok)
        throw new SystemException(String.Format("Failed to start Orleans silo '{0}' as a {1} node", siloHost.Name, siloHost.Type));
}

static void DoSomeClientWork()
{
    var config = Orleans.Runtime.Configuration.ClientConfiguration.LocalhostSilo(30000);
    GrainClient.Initialize(config);

    var friend = GrainClient.GrainFactory.GetGrain<IHello>(0);
    var result = friend.SayHello("Goodbye").Result;
    Console.WriteLine(result);
}

当我想使用相同的 AppDomain 时出现问题:

static void Main(string[] args)
{
    //Same AppDomain
    Task.Run(() => InitSilo());
    DoSomeClientWork(); //This is changed to await/retry until the Silo is Up

    ShutdownSilo();
}

为什么我要走这条路:这个想法是为了防止客户端通过网络退出并再次进入,因为它们在同一台机器上运行。由于网络活动,这会产生开销。所以我试图避免这种开销。

当然,如果本地 Silo 出现故障,客户端必须通过网络出去才能找到可用的 Silo。

让事情变得过于复杂的是,我看不到任何有用的错误,只有错误和一些 lib 引用未找到错误。

原始代码被简化只是为了避免弄脏它,但是如果你觉得你需要看看我到目前为止做了什么,请告诉我。任何帮助、建议或建议都是有用的。

4

1 回答 1

1

如果您升级到 Orleans 1.5.0,您应该能够实现这一点,因为删除了很多静态。您还应该直接使用 ClientBuilder 和 IClusterClient 而不是静态 GrainClient 才能工作。事实上,升级到 1.5.0 后 VS 中的默认模板不再为客户端/孤岛主机使用单独的 AppDomain。

话虽如此,即使在同一个 AppDomain 下,目前也没有完全跳过网络代码的内置支持,但我们正处于计划阶段以开始支持它。当前的想法是您仍然使用 IClusterClient 抽象,但在幕后,我们将通过不做任何额外的网络来做一些更智能的事情。因此,即使尚未优化,开始使用它也是最安全的选择。

于 2017-07-18T22:00:14.483 回答