RabbitMQ y canales de seguridad de hilos Java
en esta guíahttps://www.rabbitmq.com/api-guide.html RabbitMQ chicos dicen:
Canales y consideraciones de concurrencia (seguridad de subprocesos)
Las instancias de canal no deben compartirse entre subprocesos. Las aplicaciones deberían preferir usar un canal por hilo en lugar de compartir el mismo canal en varios hilos. Si bien algunas operaciones en los canales son seguras para invocar simultáneamente, algunas no lo son y darán como resultado una intercalación de trama incorrecta en el cable. Compartir canales entre hilos también interferirá con * Publisher Confirms.
La seguridad de los subprocesos es muy importante, así que intenté ser lo más diligente posible, pero aquí está el problema:
Tengo esta aplicación que recibe mensajes de Rabbit. Cuando se recibe un mensaje, lo procesa y luego confirma cuando está hecho. La aplicación puede procesar solo 2 elementos al mismo tiempo en un grupo de subprocesos fijos con 2 subprocesos. La captación previa de QOS para Rabbit está establecida en 2, porque no quiero alimentar la aplicación con más de lo que puede manejar en un período de tiempo.
Ahora, handleDelivery de mi consumidor hace lo siguiente:
Task run = new Task(JSON.parse(message));
service.execute(new TestWrapperThread(getChannel(),run,envelope.getDeliveryTag()));
En este punto, ya descubriste que TestWrapperThread hace elchannel.basicAck(deliveryTag, false);
llamar como última operación.
Según tengo entendido la documentación, esto es incorrecto y potencialmente dañino porque el canal no es seguro para subprocesos y este comportamiento podría arruinar las cosas. ¿Pero cómo se supone que debo hacer entonces? Quiero decir, tengo algunas ideas, pero definitivamente harían todo más complejo y me gustaría averiguar si es realmente necesario o no.
Gracias por adelantado