2017-08-14 55 views
0

当我尝试创建新的IgniteConfiguration实例时,我不断收到空引用异常。这是我如何创建配置:“未将对象引用设置到对象的实例”我无法让Apache Ignite.NET在我的.NET应用程序内正确启动

var cfg = new IgniteConfiguration 
       { 
        // Explicitly configure TCP discovery SPI to provide list of initial nodes 
        // from the first cluster. 
        DiscoverySpi = new TcpDiscoverySpi 
        { 
         // Initial local port to listen to. 
         LocalPort = 49500, 
         // Changing local port range. This is an optional action. 
         LocalPortRange = 2, 
         IpFinder = new TcpDiscoveryStaticIpFinder 
         { 
          // Addresses and port range of the nodes from the first cluster. 
          // 127.0.0.1 can be replaced with actual IP addresses or host names. 
          // The port range is optional. 
          Endpoints = { "127.0.0.1:49500..49520" } 
         } 
        }, 
        // Explicitly configure TCP communication SPI changing 
        // local port number for the nodes from the first cluster. 
        CommunicationSpi = new TcpCommunicationSpi 
        { 
         LocalPort = 49100 
        } 
       }; 

细节没有内部异常和消息的异常只是说

当我尝试使用web.config配置启动Ignite时,它将工作,除非我尝试明确设置端口。例如,这是一个有效的配置:

<igniteConfiguration xmlns="http://ignite.apache.org/schema/dotnet/IgniteConfigurationSection" localhost="127.0.0.1" peerAssemblyLoadingMode="CurrentAppDomain"> 
<atomicConfiguration atomicSequenceReserveSize="10" /> 
<AutoGenerateIgniteInstanceName>true</AutoGenerateIgniteInstanceName> 
<discoverySpi type="TcpDiscoverySpi" localPort="49500" localPortRange="2"> 
    <ipFinder type="TcpDiscoveryStaticIpFinder"> 
    <endpoints> 
     <string>127.0.0.1</string> 
     <string>127.0.0.1:49500..49502</string> 
    </endpoints> 
    </ipFinder> 
</discoverySpi> 

不过,我有必要不使用mutlicast广播,我需要设置明确的端口。该配置最终使用一些默认端口。所以,根据我的文档可以这样做:

<igniteConfiguration xmlns="http://ignite.apache.org/schema/dotnet/IgniteConfigurationSection" localhost="127.0.0.1" peerAssemblyLoadingMode="CurrentAppDomain"> 
<atomicConfiguration atomicSequenceReserveSize="10" /> 
<AutoGenerateIgniteInstanceName>true</AutoGenerateIgniteInstanceName> 
<discoverySpi type="TcpDiscoverySpi" localPort="49500" localPortRange="2"> 
    <ipFinder type="TcpDiscoveryStaticIpFinder"> 
    <endpoints> 
     <string>127.0.0.1</string> 
     <string>127.0.0.1:49500..49502</string> 
    </endpoints> 
    </ipFinder> 
</discoverySpi> 
<communicationSpi type="TcpCommunicationSpi" localPort="49500" localPortRange="2" /> 

明确设置端口49500,但使用此配置的应用程序不启动,只是挂在Ignite.startFromConfiguration()的一步。

所以我不能使用web.config创建实例,也不能以编程方式启动它,因为空引用异常。

任何人有任何想法?

+0

再深入一点,我发现这个异常事实上是由构建TcpDiscoveryStaticIpFinder类引发的。这对我来说没有任何意义,因为当我反编译它并查看构造函数的作用时,它看起来没有任何作用。即使是基类构造函数也是空的。但我一定在做错事。 – DKhanaf

+0

更新,所以我得到了编程配置的工作。显然它不喜欢这个Endpoints = {“127.0.0.1:49500..49520”},但它可以很好地与Endpoints = new List {“127.0.0.1:49500..49520”} – DKhanaf

回答

0

Endpoints是一个地址列表,所以它应该被初始化为new[] {...}。看到这里的例子:https://apacheignite-net.readme.io/v2.1/docs/configuration#section-c-code

至于第二个问题,你试图设置相同的发现和通信端口,这是没有道理的。这是不同的协议,应该使用不同的,不相交的端口范围。

+0

你能解释什么是在这种情况下沟通和发现之间的区别?如果我有节点A启动并使用“通信”端口45900,这是否意味着要“发现”节点A的节点B将尝试使用端口45900?或者我完全错了吗? – DKhanaf

+0

除非此行配置仅用于发现的不同端口。因此,节点A启动并在两个端口(一个用于发现(所以其他节点可以“发现”它)以及一个用于由 DKhanaf

+1

Ignite中的这两种协议同时工作。发现用于维护集群中的一致拓扑信息,用于任何其他消息(例如,缓存操作请求/响应)的通信。每个服务器节点必须绑定到这两个协议的不同端口。所以端口范围必须不同。 –

相关问题