发送另一个味精后如何接收单声道味精

时间:2019-04-15 10:57:44

标签: java project-reactor reactor-netty

如何发送buf然后接收消息

方法

Mono<ByteBuf> send(ByteBuf buf){
    // how to send the buf then receive a msg
}

我正在尝试通过从连接出站发送消息并从入站接收消息,然后返回消息Mono来实现此方法。但是我只能在then(Publisher)方法中接收消息。它似乎无法返回数据Mono

我已经尝试过了。

// the connecttion has been initialized before entering this method.

        Mono.just(buf)
                .doOnNext(data -> connection.outbound().sendObject(data).then().subscribe())
                .then(connection
                        .inbound()
                        .receiveObject()
                        .single()
                        .map(RpcDataPackage.class::cast)
                        .map(RpcDataPackage::getData)
                        .map(data -> {
                            try {
                                return resCodec.decode(data);
                            } catch (IOException e) {
                                throw new RpcRequestException(e);
                            }
                        })
                );

但是它将一直阻塞直到连接超时

我已经尝试了另一个代码。我添加了一个handle方法,并将响应放入地图中。 然后,我可以在Mono.fromSupply()处使用while循环中断来获取map.get(key) != null

它将阻塞线程。

                .handle(((nettyInbound, nettyOutbound) -> nettyInbound
                        .receiveObject()
                        .map(RpcDataPackage.class::cast)
                        .doOnNext(pkg -> {
                            String responseKey = "a key"

                            responseMap.put(responseKey, pkg);
                        })
                        .then()))

3 个答案:

答案 0 :(得分:0)

您未指定期望的内容。 参见下面的示例,它发送一些数据,然后接收服务器返回的内容。

    @Test
    public void test() {
        Connection connection =
                TcpClient.create()
                         .wiretap(true)
                         .host("example.com")
                         .port(80)
                         .connect()
                         .block();

        assertNotNull(connection);

        connection.outbound()
                  .sendObject(Unpooled.wrappedBuffer("test".getBytes()))
                  .then(connection.inbound()
                                  .receiveObject()
                                  .last()
                                  .doOnNext(System.out::println)
                                  .then())
                  .then()
                  .block();
    }

答案 1 :(得分:0)

我阅读了Mono Javadoc并找到了MonoSink。

Mono.create(monoSink -> {
  // some call
})

入站收到对象响应时,只需执行sink.success()

答案 2 :(得分:0)

您应该结合使用NettyOutbound :: then来侦听写完成和Mono :: then来组合写之后读取NettyInboud。

  Mono<String> resposeMono = TcpClient.create()
            .connect()
            .flatMap(connection -> connection.outbound().sendString(Mono.just("Hello!"))
                    .then()
                    .then(connection.inbound().receive().aggregate().asString())
                    .doOnTerminate(connection::dispose));

这将写“你好!”到输出,从输入中读取所有字节作为字符串,然后释放连接。