Spring 订阅服务器onnext不包含完整的项目
我们正在和项目反应堆合作,现在有一个巨大的问题。这是我们制作和发布数据的方式:Spring 订阅服务器onnext不包含完整的项目,spring,project-reactor,Spring,Project Reactor,我们正在和项目反应堆合作,现在有一个巨大的问题。这是我们制作和发布数据的方式: public Flux<String> getAllFlux() { return Flux.<String>create(sink -> { new Thread(){ public void run(){ Iterator<Cache.Entry<String, MyObject>>
public Flux<String> getAllFlux() {
return Flux.<String>create(sink -> {
new Thread(){
public void run(){
Iterator<Cache.Entry<String, MyObject>> iterator = getAllIterator();
ObjectMapper mapper = new ObjectMapper();
while(iterator.hasNext()) {
try {
sink.next(mapper.writeValueAsString(iterator.next().getValue()));
} catch (IOException e) {
e.printStackTrace();
}
}
sink.complete();
}
} .start();
});
}
但对于某些项目,字符串会像这样断开,例如:
{"itemId": "some"
之后的下一项是
"Id", "itemDesc", "some description"}
这些削减没有模式。它是完全随机的,每次我们运行代码时都是不同的。当然,我们的jackson正因为这种行为而在输入端出现意外错误
那么是什么导致了这种行为?我们如何解决它呢?解决方案:
发送通量中的对象,而不是字符串:
public Flux<ItemIgnite> getAllFlux() {
return Flux.create(sink -> {
new Thread(){
public void run(){
Iterator<Cache.Entry<String, ItemIgnite>> iterator = getAllIterator();
while(iterator.hasNext()) {
sink.next(iterator.next().getValue());
}
}
} .start();
});
}
这里的关键是使用stream+json,而不仅仅是json
"Id", "itemDesc", "some description"}
public Flux<ItemIgnite> getAllFlux() {
return Flux.create(sink -> {
new Thread(){
public void run(){
Iterator<Cache.Entry<String, ItemIgnite>> iterator = getAllIterator();
while(iterator.hasNext()) {
sink.next(iterator.next().getValue());
}
}
} .start();
});
}
@RequestMapping(value="/allFlux", method=RequestMethod.GET, produces="application/stream+json")