第一章:Netty介绍
2016-09-23 00:00
344 查看
整个Netty的API都是异步的。
Fetcher.fetchData()方法需传递一个FetcherCallback类型的参数,当获得数据或发生错误时被回调。
FetcherCallback.onData(),将接收数据时被调用
FetcherCallback.onError(),发生错误时被调用
回调过程有个问题就是当你使用链式调用很多不同的方法会导致线性代码;
Futures
Futures是一个抽象的概念,它表示一个值,该值可能在某一点变得可用。一个Future要么获得计算完的结果,要么获得计算失败后的异常。
Java在java.util.concurrent包中附带了Future接口,它使用Executor异步执行。
例如下面的代码,每传递一个Runnable对象到ExecutorService.submit()方法就会得到一个回调的Future,你能使用它检测是否执行完成。
有时候使用Future感觉很丑陋,因为你需要间隔检查Future是否已完成,而使用回调会直接收到返回通知。
Netty使用以上两种异步处理方式,提供两全其美的方案。
JAVA中:NIO2看起来很理想,但是NIO2只支持Jdk1.7+,若你的程序在Java1.6上运行,则无法使用NIO2。
另外,Java7的NIO2中没有提供DatagramSocket的支持,所以NIO2只支持TCP程序,不支持UDP程序。
JAVA中:ByteBuffer是一个数据容器,但是可惜的是JDK没有开发ByteBuffer实现的源码;ByteBuffer允许包装一个byte[]来获得一个实例,如果你希望尽量减少内存拷贝,那么这种方式是非常有用的。若果你想将ByteBuffer重新实现,那么不要浪费你的时间了,ByteBuffer的构造函数是私有的,所以它不能被扩展。
Netty提供了自己的ByteBuffer实现,Netty通过一些简单的APIs对ByteBuffer进行构造、使用和操作,以此来解决NIO中的一些限制。
JAVA中: NIO对缓冲区的聚合和分散操作可能会操作内存泄露。很多Channel的实现支持Gather和Scatter。这个功能允许从多个ByteBuffer中读入或写入到多个ByteBuffer,这样做可以提高性能。如果要分割的数据在多个不同的ByteBuffer中,使用Gather/Scatter是比较好的方式。
例如,你可能希望header在一个ByteBuffer中,而body在另外的ByteBuffer中:
下图显示的是Scatter(分散),将ScatteringByteBuffer中的数据分散读取到多个ByteBuffer中:
下图显示的是Gather(聚合),将多个ByteBuffer的数据写入到GatheringByteChannel:
可惜Gather/Scatter功能会导致内存泄露,直到Java7才解决内存泄露问题。使用这个功能必须小心编码和Java版本。
Callbacks(回调)
下面代码是一个简单的回调:package netty.in.action; public class Worker { public void doWork() { Fetcher fetcher = new MyFetcher(new Data(1, 0)); fetcher.fetchData(new FetcherCallback() { @Override public void onError(Throwable cause) { System.out.println("An error accour: " + cause.getMessage()); } @Override public void onData(Data data) { System.out.println("Data received: " + data); } }); } public static void main(String[] args) { Worker w = new Worker(); w.doWork(); } }
package netty.in.action; public interface Fetcher { void fetchData(FetcherCallback callback); }
package netty.in.action; public class MyFetcher implements Fetcher { final Data data; public MyFetcher(Data data){ this.data = data; } @Override public void fetchData(FetcherCallback callback) { try { callback.onData(data); } catch (Exception e) { callback.onError(e); } } }
package netty.in.action; public interface FetcherCallback { void onData(Data data) throws Exception; void onError(Throwable cause); }
package netty.in.action; public class Data { private int n; private int m; public Data(int n,int m){ this.n = n; this.m = m; } @Override public String toString() { int r = n/m; return n + "/" + m +" = " + r; } }
Fetcher.fetchData()方法需传递一个FetcherCallback类型的参数,当获得数据或发生错误时被回调。
FetcherCallback.onData(),将接收数据时被调用
FetcherCallback.onError(),发生错误时被调用
回调过程有个问题就是当你使用链式调用很多不同的方法会导致线性代码;
Futures
Futures是一个抽象的概念,它表示一个值,该值可能在某一点变得可用。一个Future要么获得计算完的结果,要么获得计算失败后的异常。
Java在java.util.concurrent包中附带了Future接口,它使用Executor异步执行。
例如下面的代码,每传递一个Runnable对象到ExecutorService.submit()方法就会得到一个回调的Future,你能使用它检测是否执行完成。
package netty.in.action; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class FutureExample { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newCachedThreadPool(); Runnable task1 = new Runnable(){ @Override public void run() { //do something System.out.println("i am task1....."); } }; Callable<Integer> task2 = new Callable<Integer>() { @Override public Integer call() throws Exception { //do something return new Integer(100); } }; Future<?> f1 = executor.submit(task1); Future<Integer> f2 = executor.submit(task2); System.out.println("task1 is completed? " + f1.isDone()); System.out.println("task2 is completed? " + f2.isDone()); //waiting task1 completed while(f1.isDone()){ System.out.println("task1 completed."); break; } //waiting task2 completed while(f2.isDone()){ System.out.println("return value by task2: " + f2.get()); break; } } }
有时候使用Future感觉很丑陋,因为你需要间隔检查Future是否已完成,而使用回调会直接收到返回通知。
Netty使用以上两种异步处理方式,提供两全其美的方案。
JAVA中:NIO2看起来很理想,但是NIO2只支持Jdk1.7+,若你的程序在Java1.6上运行,则无法使用NIO2。
另外,Java7的NIO2中没有提供DatagramSocket的支持,所以NIO2只支持TCP程序,不支持UDP程序。
JAVA中:ByteBuffer是一个数据容器,但是可惜的是JDK没有开发ByteBuffer实现的源码;ByteBuffer允许包装一个byte[]来获得一个实例,如果你希望尽量减少内存拷贝,那么这种方式是非常有用的。若果你想将ByteBuffer重新实现,那么不要浪费你的时间了,ByteBuffer的构造函数是私有的,所以它不能被扩展。
Netty提供了自己的ByteBuffer实现,Netty通过一些简单的APIs对ByteBuffer进行构造、使用和操作,以此来解决NIO中的一些限制。
JAVA中: NIO对缓冲区的聚合和分散操作可能会操作内存泄露。很多Channel的实现支持Gather和Scatter。这个功能允许从多个ByteBuffer中读入或写入到多个ByteBuffer,这样做可以提高性能。如果要分割的数据在多个不同的ByteBuffer中,使用Gather/Scatter是比较好的方式。
例如,你可能希望header在一个ByteBuffer中,而body在另外的ByteBuffer中:
下图显示的是Scatter(分散),将ScatteringByteBuffer中的数据分散读取到多个ByteBuffer中:
下图显示的是Gather(聚合),将多个ByteBuffer的数据写入到GatheringByteChannel:
可惜Gather/Scatter功能会导致内存泄露,直到Java7才解决内存泄露问题。使用这个功能必须小心编码和Java版本。
相关文章推荐
- Netty In Action中文版 - 第一章:Netty介绍
- netty in action第一章netty介绍
- Netty In Action中文版 - 第一章:Netty介绍
- 【Netty第一章】 Netty介绍
- 第一章:Netty介绍
- 第一章 介绍 实体,属性,关系
- [Learn Android Studio 汉化教程]第一章 : Android Studio 介绍
- 第一章 C语言介绍
- 培训教材笔记-介绍&第一章
- 第一章:【UCHome二次开发】uchome文件体系介绍
- 第一章 sklearn 介绍
- 第一章 介绍 第二章 安装python 第三章 最初的步骤
- Python读书笔记第一章:介绍
- Netty基础介绍与框架搭建
- [置顶] 《现代密码学》第一章——经典密码学介绍
- 第一章 介绍 实体,属性,关系
- netty基本组件介绍
- Netty介绍
- Netty 初步介绍
- SPRING IN ACTION 第4版笔记-第一章-003-AOP介绍