gpt4 book ai didi

java - 在 REST 服务 (JAX-RS) 中保留和更新数据

转载 作者:行者123 更新时间:2023-12-02 13:21:52 25 4
gpt4 key购买 nike

我正在使用 jersey (JAX-RS) 编写 REST 服务。本质上,它应该执行以下操作:

有一个文本文件,其中有很多键=值对。 REST 服务的用户应该能够查询键并接收值。

现在,为每个查询加载和拆分整个文本文件需要很长时间。相反,我想将文本文件加载到 HashMap 中并以固定的时间间隔重新加载它。

我不知道如何实现此行为,以便 Hashmap 在查询之间保留下来,并且在重新加载数据时查询 REST 服务不会导致并发问题。

我应该怎么做才能在我的应用程序中拥有这样的“缓存”?

最佳答案

JAX-RS 默认资源生命周期是针对每个请求(请求范围)的,因此您需要将资源标记为 @Singleton,以使其在并发请求之间共享。

@Singleton

javax.inject.Singleton

In this scope there is only one instance per jax-rs application. Singleton resource can be either annotated with @Singleton and its class can be registered using the instance of Application. You can also create singletons by registering singleton instances into Application.

Life-cycle of Root Resource Classes

接下来,您需要实现定期刷新的线程安全缓存,以存储您的 map 。

我通常会使用Guava CacheBuilder为此:

private final LoadingCache<Object,Map<String,String>> cache;
protected final Object CACHE_KEY = new Object();

//Create a Cache and keep it in the instance variable
public MyClass() {
this.cache = CacheBuilder.newBuilder()
.maximumSize(1)
.refreshAfterWrite(10,TimeUnit.MINUTES)
.build(new CacheLoader<Object,Map<String,String>>() {
@Override
public Map<String, String> load(Object key) {
//Parse your file and return a Map<String,String>
}
});
}

@GET
public void doIt() {
//Get a cached copy of your Map
Map<String,String> values = cache.get(CACHE_KEY);
}

缓存实例可以安全地在多个线程中使用(尽管您仍然需要注意从缓存返回的对象的线程安全),并且会每 10 分钟自动刷新一次您的条目。

在更复杂的系统中,您可能还想在其他地方创建 LoadingCache 实例,然后将其注入(inject)到您的资源类中(在这种情况下,您可以将其保留在请求范围内)。

关于java - 在 REST 服务 (JAX-RS) 中保留和更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43537021/

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