如何从两个或多个 IIS 应用程序使用 Apache Ignite

How do I use Apache Ignite from two or more IIS applications

我是 Apache Ignite 的新手,正在尝试在 IIS 网站和 WCF 服务中使用 Ignite。我的测试用例涉及一台 PC 上的两个 IIS 托管 WCF 测试服务。我在两个 IIS 应用程序中的任何一个中实例化 Ignite,然后尝试从另一个应用程序进行访问。到目前为止,这还没有奏效。 Ignite 在一个 IIS 应用程序中启动后,我从另一个应用程序获得 "Default grid instance has already been started",但另一个应用程序无法获取现有默认网格实例的句柄。

我是 运行 下面的代码来自 Global.asax Application_Start 两个 IIS 测试应用程序。希望有人能提供见解并为我指明正确的方向:

Random random = new Random();
short startCounter = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
do
{
    Thread.Sleep( 1000 * random.Next( 10, 20 ) );
    IgniteEngine = Ignition.TryGetIgnite();
    startCounter++;
    if ( null == IgniteEngine )
    {
        LogHelper.Write( "{0}: CacheManager.InitializeCache attempt {1} to get a new ignite instance failed.".InvariantFormat( CommonSystemInfo.MachineName, startCounter ), "TraceLogger" );
    }

    if ( null == IgniteEngine )
    {
        try
        {
            IgniteEngine = Ignition.Start( new IgniteConfiguration
            {
                JvmClasspath = System.IO.Directory.GetFiles( System.Web.HttpContext.Current.Server.MapPath( @"~\bin\libs" ) ).Aggregate( ( x, y ) => x + ";" + y )
            } );
            if ( null != IgniteEngine )
            {
                LogHelper.Write( "{0}: CacheManager.InitializeCache success starting ignite after {1} attempts and {2} seconds".InvariantFormat( CommonSystemInfo.MachineName, startCounter, sw.Elapsed.TotalSeconds ), "TraceLogger" );
            }
        }
        catch ( Exception ex2 )
        {
            LogHelper.Write( "{0}: CacheManager.InitializeCache error while trying to start a new ignite instance. {1}".InvariantFormat( CommonSystemInfo.MachineName, ex2.GetAllMessages() ), "TraceLogger" );
        }
    }
}
while ( null == IgniteEngine && sw.Elapsed.TotalMinutes <= 2 );

看起来您的服务 运行 在一个 IIS 应用程序池中,这意味着一个进程和不同的应用程序域。这意味着进程中只有一个 JVM,这会导致 Default grid instance has already been started 错误。

您的选择是:

  • 使用不同IgniteConfiguration.GridName
  • 为其中一项服务分配不同的 IIS 应用程序池
  • 运行 两个服务都在一个应用程序中,这样 TryGetIgnite 就可以工作,而且您不必启动 Ignite 两次