La mia libraria open source M2Mqtt è finalmente giunta alla versione 3.0 con due novità importanti !
In primo luogo le operazioni di publish, subscribe ed unsubscribe sono diventate completamente asincrone. Fino alla versione precedente, i corrispondenti metodi erano sincroni seppur la libreria sollevasse i relativi eventi di messaggio pubblicato e sottoscrizione/desottoscrizione avvenuta. In particolare, nel metodo Publish() veniva gestito lo scambio di messaggi con il broker per garantire il QoS richiesto (PUBACK per QoS 1, PUBREC, PUBREL e PUBCOMP per QoS2) mentre nei metodi Subscribe() ed Unsubscribe() veniva gestito l’acknowledge (SUBACK e UNSUBACK). Adesso, questi metodi si preoccupano di inserire un messaggio in una coda e ritornano immediatamente l’id del messaggio stesso; per questo motivo c’è un “breaking change” sul metodo Subscribe() che non ritorna più l’array con i QoS level “granted”. Tale array viene comunque fornito al termine dell’operazione asincrona nell’event args del corrispondente evento.
Ho parlato di coda ? Ebbene si ! Ho aggiunto la gestione della inflight queue !
Il concetto di inflight queue è ben presente nel mondo MQTT e viene utilizzata per gestire tutti i messaggi relativi alle operazioni di publish, subscribe ed unsubscribe. La nuova versione della libreria ha un thread dedicato che si occupa di gestire questa coda, garantendo l’esecuzione asincrona delle operazioni suddette e lo scambio dei messaggi di acknowledge con il broker in base al QoS desiderato. Grazie a questa coda, inoltre, nel caso del QoS Level 2, il flusso viene ripreso dal punto in cui era stato interrotto qualora cadesse la connessione con il broker (non è comunque gestita la persistenza della coda).
Un’ulteriore modifica riguarda l’aggiunta di un unico thread per sollevare gli eventi della libreria (nella precedente versione veniva creato un thread “a volo” per ciascun evento).
Spero di aver fatto cosa gradita per tutti coloro che usano questa libreria….ed a quanto pare non sono pochi !
Ovviamente, è come sempre disponibile su CodePlex, Nuget e nella Microsoft Code Gallery !