gpt4 book ai didi

java - Infinispan 命名缓存过期

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:03 26 4
gpt4 key购买 nike

我正在 jboss 7 上托管的 infinispan 中测试命名缓存的配置设置。我正在使用 REST 服务器 API 实现,以便我可以从任何地方访问缓存。这是我的配置文件。

<infinispan>
<namedCache name="keydata">
<!-- http://infinispan.org/docs/5.2.x/user_guide/user_guide.html#_expiration_2 -->
<expiration lifespan="1000" reaperEnabled="true" />
</namedCache>
</infinispan>

现在一切似乎都很好,实例启动并创建了我的缓存。我可以使用 REST API 将新条目推送到此命名缓存。我的问题是它们似乎永远不会过期。看起来收割者默认每 60 秒醒来一次,因为我在日志中看到了这一点:

09:15:05,920 TRACE [EvictionManagerImpl] (Scheduled-eviction-thread-0)
Purging data container of expired entries
09:15:05,920 TRACE [EvictionManagerImpl] (Scheduled-eviction-thread-0)
Purging data container completed in 0 milliseconds

如果我使用 GET 访问服务器,缓存的值就会返回。这是我这样做时的痕迹。

09:17:10,451 TRACE [InvocationContextInterceptor] (http-localhost/127.0.0.1:8280-1) 
Invoked with command GetKeyValueCommand {key=user123, flags=null} and
InvocationContext [org.infinispan.context.SingleKeyNonTxInvocationContext@2b77b3f2]
09:17:10,451 TRACE [EntryFactoryImpl] (http-localhost/127.0.0.1:8280-1)
Exists in context? null
09:17:10,451 TRACE [EntryFactoryImpl] (http-localhost/127.0.0.1:8280-1)
Retrieved from container ImmortalCacheEntry{key=user123, value=ImmortalCacheValue
{value=org.infinispan.remoting.MIMECacheEntry@90c3ab46}}
09:17:10,451 TRACE [CallInterceptor] (http-localhost/127.0.0.1:8280-1)
Executing command: GetKeyValueCommand {key=user123, flags=null}.
09:17:10,451 TRACE [GetKeyValueCommand] (http-localhost/127.0.0.1:8280-1)
Found value org.infinispan.remoting.MIMECacheEntry@90c3ab46

我会继续挖掘,但我很好奇。以前有人遇到过这个吗?为什么具有定义生命周期的命名缓存会插入 ImmortalCacheEntry 条目?

在有人建议之前,如果您确实查看了我在上面的 XML 配置文件中提到的文档,就会发现存在拼写错误。了解 XML 标记上属性的真实拼写的唯一方法是直接查看 org.infinispan.configuration.parsing.Parser52 类的源代码。

谢谢!

编辑:

我正在挖掘 infinispan 源代码,并在 org.infinispan.container.InternalEntryFactoryImpl 中看到这一点:

@Override
public InternalCacheEntry create(Object key, Object value, EntryVersion ignored, long lifespan, long maxIdle) {
if (lifespan < 0 && maxIdle < 0) return new ImmortalCacheEntry(key, value);
if (lifespan > -1 && maxIdle < 0) return new MortalCacheEntry(key, value, lifespan);
if (lifespan < 0 && maxIdle > -1) return new TransientCacheEntry(key, value, maxIdle);

return new TransientMortalCacheEntry(key, value, maxIdle, lifespan);
}

VersionedInternalEntryFactoryImpl 看起来是一样的。我知道它正在获得我的生命周期值(value),那么什么能带来呢?脑子……疼……

编辑2:

我刚刚注意到一些有趣的事情。当我创建条目时,我看到:

09:46:49,639 TRACE [EntryFactoryImpl] (http-localhost/127.0.0.1:8280-1)
Creating new entry.
09:46:49,639 TRACE [CallInterceptor] (http-localhost/127.0.0.1:8280-1)
Executing command: PutKeyValueCommand{key=user123,
value=org.infinispan.remoting.MIMECacheEntry@90c3ab46, flags=null,
putIfAbsent=false, lifespanMillis=-1000, maxIdleTimeMillis=-1000, successful=true}.

看起来它毕竟没有达到我的生命周期值(value)......

编辑3:

我想扩展我之前的编辑。经过更多的代码调试后,跟踪中的这些值似乎来自 REST API 服务请求。通过向 PUT/POST 请求添加特定 header ,可以覆盖指定缓存的生命周期和 maxIdle 值。由于我没有使用这些可选参数,它们以默认值 -1 秒显示在跟踪中,稍后会转换为毫秒。

http://infinispan.org/docs/5.2.x/user_guide/user_guide.html#_headers

也许更令人沮丧的是,如果我在 PUT 请求上传递可选覆盖,它就会起作用!我似乎无法找出为什么这个设置被忽略。我知道它正在被正确解析,因为如果我拼写错误,缓存配置构建器就会对我大喊大叫。

当然,我可以使用可选的覆盖来设置此行为,但是是否有其他东西在使用 REST 服务器时神秘地不起作用?

是的......我仍然被困住了。

最佳答案

我不知道我是如何在最初的搜索中错过这个的,但我在另一个SO问题中找到了答案。

infinispan cache server expiration failure

关于java - Infinispan 命名缓存过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22099041/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com