【问题标题】:Using netty with 3rd party blocking API将 netty 与 3rd 方阻止 API 一起使用
【发布时间】:2015-09-08 11:52:58
【问题描述】:

我正在使用第 3 方阻止 API。我将按如下方式使用此 API:

while(true){
blockingAPI();
sendResultSomewhere();
}

blockingAPI() 轮询服务器以获取特定属性,直到它得到响应。

为了使事情在某种程度上异步,我可以在一个单独的线程中生成这个 API 调用。并在 Java 中实现了一个回调来处理响应。我想知道我是否可以在这种情况下使用 netty 框架,以及如何做到这一点?我看到的示例涉及一个服务器,它监听并与客户端通信,我不确定我的用例如何适应。

如果不能使用 netty,我最好的办法是生成一个新线程并在 Java 中实现回调吗?

【问题讨论】:

    标签: java asynchronous netty


    【解决方案1】:

    不确定你真正想做什么:

    1. 在内部生成一个新线程:您可以将 LocalChannel 与 Netty 一起使用以进行 JVM 进程内通信,因此无需任何网络考虑(仅在 JVM 内)即可获得您想要的东西。 blockingAPI 将在 ServerLocalChannel 端计算,而结果将在客户端通过相同的 LocalChannel 收到响应后写入。

    2. Spawn 但有来自外部(网络)的请求,那么 Netty 当然也可以在那里使用。也许仍然保留一个 LocalChannel 逻辑来分离网络进行计算。

    请注意,我可以建议使用 LocalChannel 使用异步操作(执行阻塞任务),以便在不阻塞 Netty 的网络 IO 线程的情况下完成其他地方的发送。

    网络处理器端:

    localChannel = creationWithinNetworkHandler(networkChannelCtx);
    localChannel.writeAndFlush(something);
    

    而 LocalChannel 处理程序服务器端可以是:

    void read0(ChannelHandlerContext ctx, someData) {
      blockingAPI();
      ctx.channel().writeAndFlush(answear).addFutureListener(Channels.CloseFuture);
    }
    

    LocalChannel 处理程序客户端可以是:

    void read0(ChannelHandlerContext ctx, answear) {
      //Using ctx from Network channel side
      networkCtx.writeAndFlush(answear);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 2011-11-01
      • 1970-01-01
      • 2012-04-22
      • 2020-04-10
      • 1970-01-01
      相关资源
      最近更新 更多