public static Observable generateJson(long id, int delay, int itemSize, int numItems) { return Observable.create((Subscriber subscriber) -> { Worker worker = Schedulers.computation().createWorker(); subscriber.add(worker); worker.schedule(() -> { try { StringWriter jsonString = new StringWriter(); JsonGenerator json = jsonFactory.createJsonGenerator(jsonString); json.writeStartObject(); // manipulate the ID such that we can know the response is from the server (client will know the logic) long responseKey = getResponseKey(id); json.writeNumberField("responseKey", responseKey); json.writeNumberField("delay", delay); if (itemSize > MAX_ITEM_LENGTH) { throw new IllegalArgumentException("itemSize can not be larger than: " + MAX_ITEM_LENGTH); } json.writeNumberField("itemSize", itemSize); json.writeNumberField("numItems", numItems); json.writeArrayFieldStart("items"); for (int i = 0; i < numItems; i++) { json.writeString(RAW_ITEM_LONG.substring(0, itemSize)); } json.writeEndArray(); json.writeEndObject(); json.close(); subscriber.onNext(jsonString.toString()); subscriber.onCompleted(); } catch (Exception e) { subscriber.onError(e); } }, delay, TimeUnit.MILLISECONDS); }); }