当前位置: 首页 > 知识库问答 >
问题:

基于日期时间特性的通量发射单元

东方俊材
2023-03-14
class Data {
    private Integer id;
    private LocalDateTime sendAt;
}

List<Data> data = Arrays.asList(
        new Data(1, LocalDateTime.now().plusSeconds(1)),
        new Data(2, LocalDateTime.now().plusSeconds(2)),
        new Data(3, LocalDateTime.now().plusSeconds(3)),
        new Data(4, LocalDateTime.now().plusSeconds(5)),
        new Data(5, LocalDateTime.now().plusSeconds(8)),
        new Data(6, LocalDateTime.now().plusSeconds(13)),
        new Data(7, LocalDateTime.now().plusSeconds(21)),
        new Data(8, LocalDateTime.now().plusSeconds(34)),
        new Data(9, LocalDateTime.now().plusSeconds(55)));

Flux<Data> dataFlux = Flux.fromIterable(data);

dataFlux.takeWhile(d -> d.sendAt.isAfter( LocalDateTime.now() ))
        .subscribe(x -> System.out.println(x));

我希望这些事件在1,2,3,5,8,13,21,...秒后打印出来。

Spring WebFlux/Reactor可能吗?

共有1个答案

娄阳舒
2023-03-14

可以通过将delayteomono.delay( ) &HTTP流与mediatype.application_stream_json_value或SSE的mediatype.text_event_stream_value:

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.time.Duration;
import java.util.Arrays;
import java.util.List;

@RestController
public class FluxDateTime {
    @GetMapping(value = "/time", produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
    public Flux<Data> getData() {
        List<Data> data = Arrays.asList(
                new Data(1, 1),
                new Data(2, 2),
                new Data(3, 3),
                new Data(4, 5),
                new Data(5, 8),
                new Data(6, 13),
                new Data(7, 21),
                new Data(8, 34),
                new Data(9, 55));

        return Flux.fromIterable(data)
                .delayUntil(d -> Mono.delay(Duration.ofSeconds(d.getDelay())));
    }

    /* Keep in mind that empty constructor, getters/setters
       are purely only for JSON serialization */
    private final class Data {
        private int id;
        private int delay;

        public Data() {}

        public Data(int id, int delay) {
            this.id = id;
            this.delay = delay;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public int getDelay() {
            return delay;
        }

        public void setDelay(int delay) {
            this.delay = delay;
        }
    }
}

每个元素的通量收集延迟,直到底层的单流终止。每个单声道根据输入流数据以秒为单位延迟各自的时间。

实际上,我们已经得到了流式HTTP响应,其中包含您所需的自定义延迟:

$ curl http://localhost:8080/time
{"id":1,"delay":1} # after 1 sec
{"id":2,"delay":2} # after 2 sec
{"id":3,"delay":3} # and so on
{"id":4,"delay":5}
{"id":5,"delay":8}
{"id":6,"delay":13}
{"id":7,"delay":21}
{"id":8,"delay":34}
{"id":9,"delay":55}
 类似资料:
  • 问题内容: 假设我有以下模型: 我想通过创建一个在将来(今天+ 1或某天)结束的事件进行测试,并对日期和时间进行打桩,以便系统认为我们已经达到了该将来的日期。 就python而言,我希望能够存根所有系统时间对象。这包括,和任何其他标准日期/时间对象。 这样做的标准方法是什么? 问题答案: 编辑 :由于我的答案是此处接受的答案,因此我正在对其进行更新,以使所有人都知道在此同时创建了更好的方法,这是f

  • 问题内容: 我正在使用ehcache 2.5.4。 我有一个对象,需要整天进行缓存,并在每天的00:00 am用新值刷新。 当前使用ehcache配置,我只能设置生存时间和空闲时间,但这取决于我创建对象的时间或使用时间。即: 有没有一种方法可以使ehcache根据特定的时间使特定的缓存过期。 问题答案: 我通过扩展Ehcache的类来做到这一点: 其余的操作就像将对象的新实例而不是放入缓存一样简单

  • 问题内容: 我正在做一个自动化的查询。它需要查找最后一天晚上8点到晚上8点之间的所有交易。我当时正在考虑做这样的事情 对于自动查询,这很适合找出日期部分。但是变量的TIME部分是查询执行的当前时间。有没有一种快速简单的方法来将两个变量的时间部分硬编码为8:00 PM? 问题答案:

  • 问题内容: 我有一个脚本,需要在脚本的不同行执行以下命令: 在我的陈述中,我有以下内容: 我收到以下错误: 如果我将语句的顺序更改为: 我收到以下错误: 如果我再次将语句更改为: 我收到以下错误: 这是怎么回事,我怎么都可以工作? 问题答案: 您的麻烦是,您有一些代码希望对 模块 进行引用,而其他代码希望对类进行引用 。 显然,不能两者兼有。 当您这样做时: 您首先要设置为对该类的引用,然后立即将

  • 所以我有: < code >日期开始日期,即< code > EEST 2022年3月27日17时32分01秒 和 ,即 我需要根据这两个值生成一个新日期。我需要将240H周期添加到开始日期。240H意味着我需要添加到开始日期的10天,我最终需要一个新的日期,应该是EEST 2022年4月6日星期三17:32.01。 PS.我是Java的新手,希望我不会问愚蠢的事情。

  • 问题内容: 我有一个网络表单,用户可以在其中从日历弹出窗口中选择日期,并从下拉菜单中选择时间。目前,我正在尝试使用Date对象存储日期。 这个对象的输出类似于: 1970年1月1日,00:00:00 GMT 我真正想做的是将其分开并以类似 27/02/2013 的格式存储日期,并以24小时格式(例如 23:45) 将时间作为单独的对象。我不确定如何用Java做到这一点。 使用SimpleDateF