Ho un InputStream e un OutputStream su un server. Posso inviare una serie di richieste JSON sul filo e ottenere un flusso di risposte da questo server. Da questo, mi piacerebbe creare un wrapper che fornisca getter come getFoo()
che creano una richiesta, la inviano e ottengono una risposta.
Non sono sicuro su come gestirlo considerando che potrei avere molti clienti che usano questo singolo InputStream e OutputStream in un dato momento, e spero che ci sia un buon modo per progettarlo.
Ecco un'opzione che ho considerato:
- Il lettore InputStream legge costantemente le risposte e le inserisce in un
Map<RequestType, Response>
che memorizza l'ultima risposta per ogni RequestType (dove requestType ègetFoo
,getBar
, ecc.) - Quando chiamo
getFoo()
sul mio wrapper, scrive la richiesta su OutputStream, quindi rimane in attesa diresponseMap.get(RequestType.FOO)
, lo legge e cancella quella voce nella mappa.
Un'altra opzione:
- Quando chiamo
getFoo()
sul mio wrapper, si registra come un callback con il lettore InputStream - Quando il lettore InputStream analizza una risposta (ad esempio la risposta
foo
dall'alto) notifica a tutti gli ascoltatori che attendono la rispostafoo
, quindi cancella gli ascoltatori.
Entrambi sembrano fragili quando comincio a pensare alla concorrenza. C'è un modo migliore per avvicinarsi a questo?