例如,我希望将100500字节读入数组:
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可以拯救这里的世界,可以随意使用它。
发布于 2014-06-23 05:27:20
我找到了可以接受的解决办法。首先,以下是值得一看的内容:https://github.com/Netflix/RxJava
至于编码准则..。
异步回调示例:
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)
}
});发布于 2014-06-07 15:59:03
我知道如何处理异步计算IO,特别是异步IO。异步程序应该表示为数据流图,如编程所述。每个节点都有一组输入,每个输入都接受消息或信号,并在所有输入被填充时触发(进入线程池)。例如,表示套接字通道的节点有两个输入:一个用于ByteBuffers,另一个用于指示通道是空闲的,可以接受IO请求。因此,节点类似于函数式编程中的函数,但可以重用--没有为下一次IO操作创建新对象。
Scala (和Akka)角色不适合,因为每个参与者只有一个输入。然而,看看Scala Dataflow --我还没有学到它,但是这个名字很有前途:)。
我已经为java 用于java的数据流库开发了一个数据流库,但是它的IO部分有点过时(我认为它更优雅,或者至少不那么丑陋)。查看示例子目录中的echo服务器实现。
https://stackoverflow.com/questions/24065515
复制相似问题