将数据保留在REST服务(JAX-RS)中



我正在与Jersey(JAX-RS(一起编写REST服务。本质上,它应该执行以下操作:

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

现在,对于每个查询,加载和拆分整个文本文件要花费太长时间。相反,我想将文本文件加载到hashmap中并以固定的间隔进行重新加载。

我不知道如何实施此行为,以便在查询之间存活hashmap,并且在重新加载数据时查询其剩余服务不会引起并发问题。

在我的应用程序中我该怎么办?

jax-rs默认资源生命周期是每次要求(请求范围(,因此您需要将资源标记为@Singleton,以使其在并发请求中共享。

@singleton

javax.inject.singleton

在此范围中,每个JAX-RS应用程序只有一个实例。可以使用@singleton注释Singleton资源,可以使用应用程序实例注册其类。您还可以通过将单例实例注册到应用程序中来创建单例。

根资源类的生命周期

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

我通常会使用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实例,然后将其注入您的资源类(在这种情况下,您可以将其保留为请求(。

相关内容

  • 没有找到相关文章