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

用Mono包装阻塞客户端并执行序列

袁泓
2023-03-14

我正在尝试创建一个需要执行ssh命令的反应式应用程序。

目前,有一个SSH客户端(基于sshd mina)正在阻塞(也许有一种方法可以以非阻塞的方式使用它,但我不知道)。我的想法是围绕这个阻塞客户端创建一个包装器,这样我就可以像下面的代码一样将阻塞调用转换为Mono。

public class SshReactiveClient extends AutoCloseable {
  private final SshClient sshClient;

  public SshReactiveClient(final SshClient sshClient) {
    this.sshClient = sshClient;
  }

  public Mono<SshResponse> open(final Duration timeout) {
    return Mono.fromCallable(() -> sshClient.open(timeout))
        .subscribeOn(Schedulers.boundedElastic());
  }

  public Mono<SshResponse> execCommand(final SshCommand command, final Duration timeout) {
    return Mono.fromCallable(() -> sshClient.execCommand(command, timeout))
        .subscribeOn(Schedulers.boundedElastic());
  }

  @Override
  public void close() throws Exception {
    sshClient.close();
  }
}

首先,这样做是不是一个好主意?什么会更好?

第二点是如何编写代码,以便我可以使用前面命令的响应执行一系列ssh命令来执行下一个命令?

共有1个答案

班玉堂
2023-03-14

你的理解是正确的。您需要包装阻塞或同步代码,并在单独的调度程序上运行它。更好的方法是客户端支持异步接口。

要按顺序执行命令,需要使用反应式API构建流。

execCommand(command1)
        .flatMap(res -> {
            var command2 = getCommand2(res);
            execCommand(command2)
        })
        .flatMap(res -> {
            var command3 = getCommand3(res);
            execCommand(command3)
        })
 类似资料:
  • 我希望客户不会等待4秒然后得到实际的结果。如您所见,服务器在22:44:21.126上开始发出onNext(),客户端在22:44:24.159上获得结果。所以我不明白如果webclient有这种行为,为什么它被称为非阻塞客户端。

  • 我对假装很陌生。今天就发现吧……当我读到Spring Cloud Feign时,我的第一个问题是:“您如何包装您的Fiign客户机?” 我举个例子。假设我们有2个微服务M1和M2。M2使用来自M1的endpoint。 null 也许我完全错了,请指正。 多谢!拜拜

  • 问题内容: 我想在Python中运行一个程序,该程序每秒通过Web套接字向Tornado服务器发送一条消息。我一直在websocket-client上使用该示例; 该示例不起作用,因为它将停止while循环的执行。 有人可以给我一个例子,说明如何正确地将其实现为线程类,我既可以调用它的send方法,又可以接收消息? 问题答案: 在他们的github页面上有一个例子可以做到这一点。好像您是从该示例开

  • 如另一个问题中所述,当使用Undertow时,所有处理都应该在专用的工作线程池中完成,如下所示: 我知道可用于显式地告诉Undertow在专用的线程池中调度请求以阻止请求。我们可以通过将包装在实例中来修改上面的示例,如下所示: 调用此方法将exchange置于阻塞模式,并创建一个BlockingHttpExchange对象来存储流。当交换处于阻塞模式时,输入流方法变得可用,除了阻塞和非阻塞模式之间

  • 我们目前正在使用grpc starter包实现一个高吞吐量的spring boot应用程序https://github.com/yidongnan/grpc-spring-boot-starter,这是一个基于客户机-服务器的应用程序。我们正在将遗留的RESTendpointCRUD操作迁移到GRPC。为了获得此服务的最佳设计,我们需要以下问题的帮助: > 如果单个不可变GRPC阻塞存根客户端实例

  • 问题内容: 我使用nio频道构建了一个简单的聊天应用程序。我对网络和线程非常陌生。该应用程序用于与服务器通信(服务器/客户端聊天应用程序)。 我的问题是服务器不支持多个客户端。我该如何解决这个问题?我的代码中的错误是什么? 问题答案: 初学者Hello NIO Server的 理想之地