Как использовать кеш JAX-RS при использовании клиента JAX-RS - PullRequest
0 голосов
/ 30 сентября 2018

Я изучаю RESTfull веб-сервисов.Я узнал, как работает кеш, и сделал несколько POC на них.Протестировано с плагином для браузера и почтальона.Но в режиме реального времени клиенты будут использовать любую услугу, я имею в виду код Java.Поэтому, когда мы используем клиент веб-службы JAX-RS, я не могу использовать поведение кэша.Каждый запрос ведет себя как новый запрос.

Вот код

Сервисный код:

package com.howtodoinjava.demo.rest.service;

import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.CacheControl;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;

import com.howtodoinjava.demo.rest.data.UserDatabase;

@Path("/user-service")
public class UserService 
{
    @GET
    @Path("/users/{id}")
    public Response getUserById(@PathParam("id") int id, @Context Request req) 
    {
         CacheControl cc = new CacheControl();
         cc.setMaxAge(86400);

        Response.ResponseBuilder rb = null;
        /*
         * Avoid trouble Avoid trouble: The granularity of dates used in HTTP headers is not as
         *  precise as some dates used in data sources.  For example, the precision for a date in a
         *   database row might be defined to the millisecond. However, the date in an HTTP header
         *    field is only precise to seconds. When evaluating HTTP preconditions, if you compare a 
         *    java.util.Date object to the date in an HTTP header, the difference in precision might 
         *    produce unexpected results. To avoid this problem, normalize the java.util.Date object
         *     before comparing to the date value in the HTTP header.
         * */
        EntityTag etag = new EntityTag(UserDatabase.getLastModifiedById(id).getMinutes()+""); 
        rb = req.evaluatePreconditions(etag);

        if (rb != null) 
        {
            return rb.cacheControl(cc).tag(etag).build();
        }

        rb = Response.ok(UserDatabase.getUserById(id)).cacheControl(cc).tag(etag);
        return rb.build();
    }

    @PUT
    @Path("/users/{id}")
    public Response updateUserById(@PathParam("id") int id) 
    {
        UserDatabase.updateUser(id);
        return Response.status(200).build();
    }
}

Код клиента:

package com.restfullexample.client.cache;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.MediaType;

public class CacheExample {

    public static void main(String[] args) {

        Client client = ClientBuilder.newClient();

        client.target("http://localhost:9090/restfullexample/user-service/users/1").request(MediaType.APPLICATION_JSON)
                .get();
        client.target("http://localhost:9090/restfullexample/user-service/users/1").request(MediaType.APPLICATION_JSON)
                .get();
    }
}

1 Ответ

0 голосов
/ 02 октября 2018

Добавляя фильтры запросов и ответов на стороне клиента.В фильтрах ответов я кеширую данные с помощью EHCache, а в фильтре запросов я проверяю в кеше этот запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...