Spring Data Gemfire - 从 JNDI 读取定位器

Spring Data Gemfire - Reading locators from JNDI

我正在尝试从 JNDI 读取定位器主机和端口信息,其值的格式为 host[port],host2[port2]。

<jee:jndi-lookup id="locatorsJndi" jndi-name="locators/locator1" />
<gfe:pool id="locatorPool" locators="#{locatorsJndi}">

似乎 Spring Data gemfire 在这种情况下无法正确识别定位器。它将 JNDI 查找值字符串作为一个主机,并在末尾附加端口 10334。

Unable to connect to any locators in the list [**host[10334],host2[10334]**:10334]; nested exception is com.gemstone.gemfire.cache.client.NoAvailableLocatorsException:

但是,如果我将主机和端口值作为定位器属性的一部分传递如下,它会按预期工作。

<gfe:pool id="locatorPool" locators="host1[port1],host2[port2]">

这是 Spring Data Gemfire 中的问题吗?

由于底层异常是 NoAvailableLocatorsException,请您尝试连接到来自 gfsh 的定位器,看看是否成功?

gfsh>connect --locator=host1[port1]

Unable to connect to any locators in the list "host[10334],host2[10334]:10334]";

堆栈跟踪消息中的 host/port,以逗号分隔的字符串不正确。

我收集到你的 JNDI 上下文中的 GemFire 定位器配置正确指定为...“host[10334],host2[10334]”?

如果是这样,那么这归结为一个简单的事实,即 Spring Data GemFire 没有正确地,或者更确切地说,目前没有处理 [=14] 中的 SpEL 表达式=] 和 servers <gfe:pool> XML 命名空间元素基于 bean 定义的属性。

但是,它确实处理 Spring 属性 占位符,如...

<gfe:pool id="locatorsPool" locators="${app.gemfire.locators}"/>

理解当前行为的原因是一个相当长且复杂的解释,但肯定可以改进。所以,我提交了 SGF-535.

NOTE: I fixed a similar issue in the PoolParser when property placeholders were specified with the locators and servers attributes in SGF-433.

要解决此问题,您可以执行以下操作...

<jee:jndi-lookup id="locatorsJndi" jndi-name="locators/locator1"/>

<util:properties id="applicationProperties">
  <prop key="locators">#{locatorsJndi}</prop>
</util:properties>

<context:property-placeholder properties-ref="applicationProperties"/>

<gfe:pool id="locatorPool" locators="${locators}"/>

关注 SGF-535 了解我的最新进展。

抱歉给您带来不便,

约翰