Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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
Java 如何将TestScheduler与RxNetty http服务器一起使用_Java_Rx Java_Rx Netty - Fatal编程技术网

Java 如何将TestScheduler与RxNetty http服务器一起使用

Java 如何将TestScheduler与RxNetty http服务器一起使用,java,rx-java,rx-netty,Java,Rx Java,Rx Netty,我正在尝试创建一个模拟服务器,以帮助更容易地为在事件流上运行的客户机编写测试 我正在用RxNetty实现服务器和客户端,我的问题是如何使用带有RxNetty的TestScheduler来控制何时发出事件 这是我的(简化)服务器: 这里是指向my和尝试使用服务器的链接。TestScheduler要求您使用其advanceTime*方法提前时间,以触发任何计划的操作Observable.interval()在提供的调度程序上调度操作,在本例中,该调度程序是一个TestScheduler。如果在Tes

我正在尝试创建一个模拟服务器,以帮助更容易地为在事件流上运行的客户机编写测试

我正在用RxNetty实现服务器和客户端,我的问题是如何使用带有RxNetty的TestScheduler来控制何时发出事件

这是我的(简化)服务器:


这里是指向my和尝试使用服务器的链接。

TestScheduler
要求您使用其
advanceTime*
方法提前时间,以触发任何计划的操作
Observable.interval()
在提供的调度程序上调度操作,在本例中,该调度程序是一个
TestScheduler
。如果在
TestScheduler
中不提前时间,它将永远不会执行操作;在这种情况下,
Observable.interval()
的勾号

如果查看以下代码,请删除RxNetty:

    TestScheduler scheduler = Schedulers.test();
    TestSubscriber<Long> subscriber = new TestSubscriber<>();
    Observable.interval(1, TimeUnit.MILLISECONDS, scheduler)
              .take(1)
              .subscribe(subscriber);

    scheduler.advanceTimeBy(1, TimeUnit.MILLISECONDS);

    System.out.println(subscriber.getOnNextEvents().size());
TestScheduler=Schedulers.test();
TestSubscriber subscriber=新的TestSubscriber();
可观察的时间间隔(1,TimeUnit.ms,调度程序)
.采取(1)
.认购(认购人);
scheduler.advanceTimeBy(1,时间单位为毫秒);
System.out.println(subscriber.getOnNextEvents().size());

输出将始终为1。OTOH,如果您注释掉
scheduler.advanceTimeBy(1,TimeUnit.ms)始终为0。

谢谢@user2607715我已经能够以您在这里描述的类似方式让interval stuff与测试调度器一起工作,我甚至让它与RxNetty一起接收事件流。但是,我无法让它与发送消息的服务器一起工作。我将更新我的问题,以显示我在客户端做的事情。@BenWhitehead代码的问题是服务器接收到的请求与时间提前的
testScheduler
之间存在固有的竞争条件。为了证明这个假设,如果你在推进测试调度程序之前添加睡眠,你会看到你得到了预期的响应。谢谢@Nitesh Kant,我将研究我能做些什么来解决这个问题。我错误地猜测服务器线程不会受到testScheduler的影响。
    final int serverPort = server.getServerPort();
    final URI uri = URI.create(String.format("http://localhost:%d/api/v1/scheduler", serverPort));
    final HttpClient<ByteBuf, ByteBuf> client = RxNetty.<ByteBuf, ByteBuf>newHttpClientBuilder(uri.getHost(), uri.getPort())
        .pipelineConfigurator(new HttpClientPipelineConfigurator<>())
        .build();

    final Event event = new Event("some event")

    final TestScheduler clientReceiveScheduler = new TestScheduler();
    final HttpClientRequest<ByteBuf> request = HttpClientRequest.createPost(uri.getPath())
        .withHeader("Content-Type", "application/x-protobuf")
        .withHeader("Accept", "application/x-protobuf")
        .withContent(event.toByteArray());

    final Observable<byte[]> observable = client.submit(request)
        .flatMap(AbstractHttpContentHolder::getContent)
        .map(BufUtils::bufToBytes)
        .zipWith(Observable.interval(10, TimeUnit.MILLISECONDS, clientReceiveScheduler), (b, l) -> b)
        .doOnNext((b) -> LOGGER.info("Received bytes: {}", Arrays.toString(b)));

    final TestSubscriber<Event> sub = new TestSubscriber<>();
    observable.subscribe(sub);

    testScheduler.advanceTimeBy(10, TimeUnit.MILLISECONDS);
    clientReceiveScheduler.advanceTimeBy(10, TimeUnit.MILLISECONDS);
    sub.getOnNextEvents()
        .stream()
        .forEach(System.out::println);
    TestScheduler scheduler = Schedulers.test();
    TestSubscriber<Long> subscriber = new TestSubscriber<>();
    Observable.interval(1, TimeUnit.MILLISECONDS, scheduler)
              .take(1)
              .subscribe(subscriber);

    scheduler.advanceTimeBy(1, TimeUnit.MILLISECONDS);

    System.out.println(subscriber.getOnNextEvents().size());