Java – cache method logic in Jersey

I have several get methods in various classes Plan to introduce caching for all of these

Logic is like this

@GET
@Path("/route1") {

    String cacheKey = routePathWithParams;
    if (cache.get(cacheKey) != null) {
        return cache.get(cacheKey);
    } else {
        // call servcie and get response
        cache.put(cacheKey,response)
        return response;
    }

}

I don't want to put this logic in all get methods Which is the best place

Can I use the filter?

public class CacheFilter implements ContainerRequestFilter,ContainerResponseFilter {


    public void filter(ContainerRequestContext req) throws IOException {
        // frame cacheKey from url and params
        if (cache.get(cacheKey) != null) {
            // return response from here.  How to do it ???
        } else { 
            //forward the request  How to do it ???
        }
    }

    public void filter(ContainerRequestContext req,ContainerResponseContext res) {
        // frame cachekey and put response
        cache.put(cacheKey,response)

    }
}

Or there are better ways to do this Basically, this problem is not about client caching or sending cache headers to users

Basically, I try to cache internal service calls in routing methods

Solution

I'm trying something like this

public class CachedInterceptor implements WriterInterceptor {

    @Override
    public void aroundWriteTo(WriterInterceptorContext context) throws IOException,WebApplicationException {
        OutputStream outputStream = context.getOutputStream();

        String key = "key";

        try {
            byte[] entity = cache.get(key);

            if (entity == null) {
                ByteArrayOutputStream buffer = new ByteArrayOutputStream();
                context.setOutputStream(buffer);
                context.proceed();

                entity = buffer.toByteArray();

                cache.put(key,entity);
            }

            outputStream.write(entity);
        } finally {
            context.setOutputStream(outputStream);
        }
    }
}

But action will be taken anyway

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>