in questa guida https://www.rabbitmq.com/api-guide.html RabbitMQ Stato ragazzi:RabbitMQ e canali filo di sicurezza Java
Canali e considerazioni Concorrenza (thread-safe) casi
canale non deve essere condiviso tra i thread. Le applicazioni dovrebbero preferire l'uso di un canale per thread invece di condividere lo stesso canale su più thread. Mentre alcune operazioni sui canali sono sicure da richiamare contemporaneamente, alcune non lo sono e generano un interleaving della trama errato sul filo. La condivisione di canali tra thread interferirà anche con * Conferme Publisher.
sicurezza Discussione è molto importante così ho cercato di essere il più diligente possibile, ma ecco il problema:
Ho questa applicazione che riceve i messaggi da coniglio. Quando viene ricevuto un messaggio, lo elabora e poi lo fa quando viene terminato. L'applicazione può elaborare solo 2 elementi contemporaneamente in un pool di thread fisso con 2 thread. Il prefetch di QOS per Rabbit è impostato su 2, perché non voglio alimentare l'app con più di quanto possa gestire in un intervallo di tempo.
Ora, handleDelivery di mia consumatore effettua le seguenti operazioni:
Task run = new Task(JSON.parse(message));
service.execute(new TestWrapperThread(getChannel(),run,envelope.getDeliveryTag()));
A questo punto, è già capito che TestWrapperThread fa la chiamata channel.basicAck(deliveryTag, false);
come ultima operazione.
Dalla mia comprensione della documentazione, questo è errato e potenzialmente dannoso perché il canale non è thread-safe e questo comportamento potrebbe rovinare tutto. Ma come dovrei fare allora? Voglio dire, ho qualche idea, ma loro renderebbero tutto più complesso e mi piacerebbe capirlo se è davvero necessario o no.
Grazie in anticipo
Se ho capito, la tua domanda riguarda il multithreading channel.basicAck (deliveryTag, false); è giusto? – Gabriele
corretto. Questa è la mia unica preoccupazione –