¿Cómo almacenar en caché el objeto httpclient en Java?

Uso de Apache HttpClient 4.5.x en la aplicación web de mi cliente que se conecta (e inicia sesión) en otra aplicación web (por ejemplo, principal).

La relación entre estas 2 webapps es de muchos a muchos, lo que significa que para la solicitud de algún usuario en la aplicación web del cliente, debe iniciar sesión como otro usuario + hacer una llamada de descanso en la aplicación web del servidor. Por lo tanto, se necesita cierta separación de las tiendas de cookies y no hay forma (¿existe?) De obtener / configurar la tienda de cookies después de crear una instancia de httpclient, por lo que cada subproceso recibido en la aplicación web del cliente hace algo como esto (y necesita optimizar):

HttpClient client = HttpClientBuilder.create().setDefaultCookieStore(new BasicCookieStore()).build();
//Now POST to login end point and get back JSESSIONID cookie and then make one REST call, and then the client object goes out of scope when the request ends.

Esperaba preguntar sobre la mejor práctica de almacenar en caché el objeto de instancia httpclient como pesado y se supone que debe reutilizarse para al menos múltiples solicitudes, si no para toda la aplicación web del cliente como un singleton estático.

Específicamente, esperaba consejos sobre cuál de estos enfoques (si los hubiera) constituiría una mejor práctica:

  1. Utilice un ConcurrentHashMap estático para almacenar en caché el httpclient y su almacén de cookies básico asociado para cada "usuario" en la aplicación web del cliente, y para iniciar sesión solo cuando la cookie en caché contenida esté cerca de su hora de caducidad. No estoy seguro sobre el uso de la memoria, y el cliente http no utilizado / rara vez permanece en la memoria sin desalojo.

  2. Guarde en caché solo la cookie (de alguna manera), pero vuelva a crear un nuevo objeto httpclient cada vez que surja la necesidad de usar esa cookie para una llamada de descanso. Esto ahorra la llamada previa para iniciar sesión hasta que la cookie caduque, pero no se reutiliza htptclient.

  3. PooledConnectionManager , pero no puede encontrar ejemplos fácilmente, aunque puede requerir diseñar una estrategia de desalojo, un número máximo de subprocesos, etc. (por lo que puede ser complejo).

¿Hay alguna forma mejor de hacer esto? Gracias.

Referencias

En general, se recomienda tener una única instancia de HttpClient por componente de comunicación o incluso por aplicación

  • Similar en la guía de rendimiento java httpclient 4.x para resolver el problema
Respuesta 1

¿Por qué querrías hacer todo esto? Se puede asignar una diferente CookieStorepor solicitud utilizando un local HttpContext.

Si es necesario, se puede mantener un mapa de CookieStoreinstancias por usuario único.

CloseableHttpClient httpclient = HttpClients.createDefault();
CookieStore cookieStore = new BasicCookieStore();

// Create local HTTP context
HttpClientContext localContext = HttpClientContext.create();
// Bind custom cookie store to the local context
localContext.setCookieStore(cookieStore);

HttpGet httpget = new HttpGet("http://httpbin.org/cookies");
System.out.println("Executing request " + httpget.getRequestLine());

// Pass local context as a parameter
CloseableHttpResponse response = httpclient.execute(httpget, localContext);
try {
    System.out.println("----------------------------------------");
    System.out.println(response.getStatusLine());
    List<Cookie> cookies = cookieStore.getCookies();
    for (int i = 0; i < cookies.size(); i++) {
        System.out.println("Local cookie: " + cookies.get(i));
    }
    EntityUtils.consume(response.getEntity());
} finally {
    response.close();
}
Respuesta: 2

¿Alguien puede sugerir una solución para el siguiente escenario? Tenemos menús de restaurantes. Cada restaurante tiene su propio menú. El objetivo es identificar los elementos en el menú, como elementos del menú, ingredientes, ...

Quiero que mi código se repita, pero reinicialice la variable a 0. Cada vez que ingreso un número, lo agrego al resultado anterior, pero quiero que se restablezca. Adjunto dos imágenes a continuación. Uno es el actual ...

Me gustaría saber qué pensar cuando escribo lo que debería ser un método perfectamente bueno, pero no se reconoce como un método. Aquí está. GObject privado getCollidingObject () {gobj = ...

Este es el resultado final que estoy tratando de obtener: ItemStack block = new ItemStack (Block.dirt, 1); Y esto es lo que tengo String s = "Block.dirt"; ItemStack block = nuevo ItemStack (, 1); Eso ...