Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Reactor-如何缓冲Rest POST方法中接收的消息_Spring_Rest_Spring Boot_Project Reactor - Fatal编程技术网

Spring Reactor-如何缓冲Rest POST方法中接收的消息

Spring Reactor-如何缓冲Rest POST方法中接收的消息,spring,rest,spring-boot,project-reactor,Spring,Rest,Spring Boot,Project Reactor,我是Reactor的新手,我正在尝试更新一个现有的Spring rest服务,以等待接收100条消息,或者直到自上次保存之前的时间超过30秒,才能保存我接收到的消息 @RequestMapping(method = RequestMethod.POST) @ResponseStatus(value = HttpStatus.OK) public void create(@RequestBody String reqJsonString) throws JsonParseException, J

我是Reactor的新手,我正在尝试更新一个现有的Spring rest服务,以等待接收100条消息,或者直到自上次保存之前的时间超过30秒,才能保存我接收到的消息

@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK) 
public void create(@RequestBody String reqJsonString) throws JsonParseException, JsonMappingException, IOException {

    Flux.just(json).bufferTimeout(100, Duration.ofSeconds(30))
    .publishOn(Schedulers.elastic()).subscribe(list -> {

        LOG.info("size:”+list.size());
        this.save(list);

    });
}
但是,即使我向rest服务发送了数百条消息,列表也只包含一条消息。
在将POST消息保存为一批之前,如何在列表中缓冲POST消息

我不确定是否理解您想要做什么,但每次调用Flux.just(json)时,您都会创建一个新的Flux项

您必须创建一个发布者,并为每个json调用onNext。subscribe()部分将不在POST处理中

下面是我根据文档创建的一个简单示例(很抱歉我太草率了)

导入reactor.core.publisher.Flux;
导入reactor.core.publisher.UnicastProcessor;
导入java.time.Duration;
导入java.util.array;
导入java.util.concurrent.ArrayBlockingQueue;
导入java.util.concurrent.ThreadPoolExecutor;
导入java.util.concurrent.TimeUnit;
公开课考试{
专用UnicastProcessor hotSource=UnicastProcessor.create();
私有流量hotFlux=hotSource.publish().autoConnect();
public void nextItem(字符串){
hotSource.onNext(字符串);
}
公开作废完成(){
hotSource.onComplete();
}
公共静态void main(字符串[]args)引发InterruptedException{
测试=新测试();
//模拟在中执行的POST调用//
ThreadPoolExecutor ThreadPoolExecutor=新的ThreadPoolExecutor(2,2,1L,TimeUnit.SECONDS,新的ArrayBlockingQueue(5));
threadPoolExecutor.submit(()->{
试一试{
//应该在前2个之前获得前2个
测试。nextItem(“第一”);
睡眠(1000);
第二次测试;
睡眠(1000);
//应该得到一个元素,因为2.5s将在第三和第四之间通过
测试。nextItem(“第三”);
睡眠(2500);
//应获取单个元素,并完成
测试。nextItem(“第四”);
睡眠(3000);
test.complete();
}捕捉(中断异常e){
e、 printStackTrace();
}
});
测试.热通量.缓冲超时(2,持续时间.百万(2000))
.订阅(
list->System.out.println(“get:+Arrays.toString(list.toArray()))
);
线程池执行器等待终止(10L,时间单位秒);
threadPoolExecutor.shutdown();
}
}

了解您的想法,为此,您需要类似于共享
处理器的东西,它将负责接收结果:

class MyController {    
   private Sink<String> sink;

   MyController() {
      Flux.<String>push(sink -> this.sink = sink)
          .bufferTimeout(100, Duration.ofSeconds(30))
          .publishOn(Schedulres.elastic())
          .subscribe(list -> {

            LOG.info("size:”+list.size());
            this.save(list);

          });
   }



    @RequestMapping(method = RequestMethod.POST)
    @ResponseStatus(value = HttpStatus.OK) 
    public void create(@RequestBody String reqJsonString) throws JsonParseException, JsonMappingException, IOException {
        sink.onNext(reqJsonString);
    }
}
类MyController{
私人水槽;
MyController(){
Flux.push(sink->this.sink=sink)
.bufferTimeout(100,持续时间秒(30))
.publishOn(Schedulres.elastic())
.订阅(列表->{
LOG.info(“大小:+list.size());
保存(列表);
});
}
@RequestMapping(method=RequestMethod.POST)
@ResponseStatus(值=HttpStatus.OK)
public void create(@RequestBody String reqJsonString)抛出JsonParseException、JsonMappingException、IOException{
sink.onNext(reqJsonString);
}
}

@Michael Petch我不知道你为什么提到我,我没有问这个问题,也没有添加tags@MichaelPetch不,我想我们是同时编辑的,我没有删除或添加任何标记。因此,这是堆栈溢出中的脏读错误。无论如何,在审阅和编辑中都是最好的。
class MyController {    
   private Sink<String> sink;

   MyController() {
      Flux.<String>push(sink -> this.sink = sink)
          .bufferTimeout(100, Duration.ofSeconds(30))
          .publishOn(Schedulres.elastic())
          .subscribe(list -> {

            LOG.info("size:”+list.size());
            this.save(list);

          });
   }



    @RequestMapping(method = RequestMethod.POST)
    @ResponseStatus(value = HttpStatus.OK) 
    public void create(@RequestBody String reqJsonString) throws JsonParseException, JsonMappingException, IOException {
        sink.onNext(reqJsonString);
    }
}
@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK) 
public void create(@RequestBody String reqJsonString) throws JsonParseException, JsonMappingException, IOException {

    Flux.just(json).bufferTimeout(100, Duration.ofSeconds(30))
    .publishOn(Schedulers.elastic()).subscribe(list -> {

        LOG.info("size:”+list.size());
        this.save(list);

    });
}