An example of slowly replying with binary data in a stream using Resteasy reactive:
@GET
@Path("/multi-stream")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Multi<byte[]> getSomeBinary(@QueryParam("approxBytes") int approxBytes) {
log.error("In getMulti [{}]", approxBytes);
Multi<byte[]> res = Multi.createFrom().emitter(emitter -> {
Thread t = new Thread(() -> {
log.error("Starting emitting data");
int sent = 0;
do {
byte[] data = getSomeSlowData();
sent += data.length;
emitter.emit(data);
log.error("Sent another [{}] bytes totalling [{}]", data.length, sent);
} while (sent < approxBytes);
emitter.complete();
log.error("Finished emitting");
});
t.setName("data-emitter");
t.start();
});
log.error("Out getMulti");
return res;
}
private byte[] getSomeSlowData() {
Random r = new Random();
byte[] someData = new byte[10240];
r.nextBytes(someData);
try {
Thread.sleep(1000);
} catch (Exception e) {
log.warn("Error:", e);
}
return someData;
}