首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NIO.2异步信道编码指南

NIO.2异步信道编码指南
EN

Stack Overflow用户
提问于 2014-06-05 16:30:14
回答 2查看 316关注 0票数 0

例如,我希望将100500字节读入数组:

代码语言:javascript
复制
byte[] array = new byte[100500];
int offset = 0;
ByteBuffer buf = ByteBuffer.directBuffer(4096);

channel.read(buffer, null, new LambdaAdapter((count, exception, attachment) -> {
    buf.get(array, offset, count);
    offset += count; //will not work, offset must be final
    if (offset < 100500) {
        channel.read(buffer, null, /*what here? must be lambda we are currently in but we can't use it!*/)
    }
    //here we have our 100500 bytes inside array
});

这里的LambdaAdapter是一个简单的包装器,它用三个参数将CompletionHandler转换为函数接口。

不管怎么说。偏移量可以设置为“附件”参数,lambda可以事先声明并作为字段重用。然而,生成的代码总是丑陋的丑陋。

即使对于如此简单的任务,我也无法编写可接受的解决方案--在复杂协议中,读取与写交织在一起并包装在复杂的逻辑中,这会是什么样子呢?

有人知道处理异步API的合适方法吗?如果您认为Scala可以拯救这里的世界,可以随意使用它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-23 05:27:20

我找到了可以接受的解决办法。首先,以下是值得一看的内容:https://github.com/Netflix/RxJava

至于编码准则..。

  • 异步方法是在执行任何有用的工作之前返回的方法。
  • 异步操作代码应该从创建新对象开始,让我们称之为上下文 startMyAsync(String p1,int p2,观察者回调){返回新的MyAsyncContext(p1,p2,回调).start();}
  • 不使用异步操作方法的结果--让我们返回Void。这很有用,因为编译器将为您检查每个异步方法是否调用另一个异步方法或显式返回null。
  • 异步方法可以引发异常。
  • 异步回调不应引发异常--必须使用回调错误处理程序。
  • 异步回调应该只包含try...catch和上下文方法调用。
  • 异步回调也应该返回Void。
  • 不需要CompletionHandler提供的额外数据--应该使用上下文字段。如果异步流不分裂,则不需要同步。

异步回调示例:

代码语言:javascript
复制
return myAsyncMethod(param1, param2, (result, exc, att) -> {
    try {
        if (exc != null) {
            return handleError(exc); //cleanup resources and invoke parentHandler.complete(null, exc, null)
        } else {
            return handleResult(result);
        }
    } catch (Exception e) {
        return handleError(exc); //cleanup resources and invoke parentHandler.complete(null, exc, null)
    }
});
票数 0
EN

Stack Overflow用户

发布于 2014-06-07 15:59:03

我知道如何处理异步计算IO,特别是异步IO。异步程序应该表示为数据流图,如编程所述。每个节点都有一组输入,每个输入都接受消息或信号,并在所有输入被填充时触发(进入线程池)。例如,表示套接字通道的节点有两个输入:一个用于ByteBuffers,另一个用于指示通道是空闲的,可以接受IO请求。因此,节点类似于函数式编程中的函数,但可以重用--没有为下一次IO操作创建新对象。

Scala (和Akka)角色不适合,因为每个参与者只有一个输入。然而,看看Scala Dataflow --我还没有学到它,但是这个名字很有前途:)。

我已经为java 用于java的数据流库开发了一个数据流库,但是它的IO部分有点过时(我认为它更优雅,或者至少不那么丑陋)。查看示例子目录中的echo服务器实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24065515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档