spring 的嵌入式 Ignite 从不调用自定义 SegmentationResolver
Embedded Ignite with spring never calls custom SegmentationResolver
我尝试在嵌入在 tomcat 网络应用程序中的 Ignite 集群中管理网络分段。我创建了一个自定义的 segmentationResolver 来 ping 数据库服务器。
所以我使用 spring 上下文
配置 Ignite
<beans:bean id="segmentationResolver" class="my.cluster.JdbcPingSegmentationResolver"/>
<beans:bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<beans:property name="gridLogger">
<beans:bean class="org.apache.ignite.logger.slf4j.Slf4jLogger"/>
</beans:property>
<beans:property name="workDirectory" value="#{systemProperties[igniteTmpDir]}"/>
<beans:property name="segmentationResolvers" ref="segmentationResolver" />
<beans:property name="segmentCheckFrequency" value="10000" />
<beans:property name="segmentationPolicy" value="NOOP" />
<beans:property name="waitForSegmentOnStart" value="true" />
<beans:property name="communicationSpi">....
我的 JdbcPingSegmentationResolver 的构造函数由 spring 调用,但它的方法 isValidSegment() 从未被调用。即使我启动/停止另一个 Ignite 节点(它必须在集群拓扑更改时调用)。
@Override
public boolean isValidSegment() throws IgniteCheckedException {
var reachable = false;
try {
Process exec = Runtime.getRuntime().exec("ping " + hostname);
//0 - normal termination
reachable = exec.waitFor(1, TimeUnit.SECONDS);
} catch (IOException | InterruptedException e) {
LOGGER.error("segmentation network : {}", e.getMessage(), e);
}
LOGGER.debug("check segmentation network status : {}", reachable);
return reachable;
}
分段解析器由 GridSegmentationProcessor
调用。默认处理器是 org.apache.ignite.internal.processors.segmentation.os.GridOsSegmentationProcessor
实际上是 noop。 GridGain Enterprise Edition(它是 Apache Ignite 的 vendor-supported 交付)指定了正确处理解析器的处理器。
我相信在拓扑更改(节点离开、连接等)时调用的机器是 topology validator。
我尝试在嵌入在 tomcat 网络应用程序中的 Ignite 集群中管理网络分段。我创建了一个自定义的 segmentationResolver 来 ping 数据库服务器。
所以我使用 spring 上下文
配置 Ignite<beans:bean id="segmentationResolver" class="my.cluster.JdbcPingSegmentationResolver"/>
<beans:bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<beans:property name="gridLogger">
<beans:bean class="org.apache.ignite.logger.slf4j.Slf4jLogger"/>
</beans:property>
<beans:property name="workDirectory" value="#{systemProperties[igniteTmpDir]}"/>
<beans:property name="segmentationResolvers" ref="segmentationResolver" />
<beans:property name="segmentCheckFrequency" value="10000" />
<beans:property name="segmentationPolicy" value="NOOP" />
<beans:property name="waitForSegmentOnStart" value="true" />
<beans:property name="communicationSpi">....
我的 JdbcPingSegmentationResolver 的构造函数由 spring 调用,但它的方法 isValidSegment() 从未被调用。即使我启动/停止另一个 Ignite 节点(它必须在集群拓扑更改时调用)。
@Override
public boolean isValidSegment() throws IgniteCheckedException {
var reachable = false;
try {
Process exec = Runtime.getRuntime().exec("ping " + hostname);
//0 - normal termination
reachable = exec.waitFor(1, TimeUnit.SECONDS);
} catch (IOException | InterruptedException e) {
LOGGER.error("segmentation network : {}", e.getMessage(), e);
}
LOGGER.debug("check segmentation network status : {}", reachable);
return reachable;
}
分段解析器由 GridSegmentationProcessor
调用。默认处理器是 org.apache.ignite.internal.processors.segmentation.os.GridOsSegmentationProcessor
实际上是 noop。 GridGain Enterprise Edition(它是 Apache Ignite 的 vendor-supported 交付)指定了正确处理解析器的处理器。
我相信在拓扑更改(节点离开、连接等)时调用的机器是 topology validator。