文档章节

第一章:Netty介绍

土茯苓
 土茯苓
发布于 2016/09/23 11:21
字数 931
阅读 38
收藏 1

整个Netty的API都是异步的。

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版本。

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
土茯苓
粉丝 32
博文 175
码字总数 197813
作品 0
朝阳
高级程序员
私信 提问
小白带你认识netty(三)之NioEventLoop的线程(或者reactor线程)启动(二)

在上一章中,我们观摩完了轮询注册到reactor线程对用的selector上的所有的channel的IO事件的过程,这次,我们继续了解下处理IO事件的过程: 2、处理IO事件 在NioEventLoop类中,run方法执行完...

天空小小
2018/11/22
0
0
Netty 源码分析之 三 我就是大名鼎鼎的 EventLoop(二)

接上篇Netty 源码分析之 三 我就是大名鼎鼎的 EventLoop(一) Netty 的 IO 处理循环 接下来我们先从 IO 操纵方面入手, 看一下 TCP 数据是如何从 Java NIO Socket 传递到我们的 handler 中的....

永顺
2017/11/29
0
0
Netty 源码分析之 二 贯穿Netty 的大动脉 ── ChannelPipeline (一)

目录 源码之下无秘密 ── 做最好的 Netty 源码分析教程 Netty 源码分析之 番外篇 Java NIO 的前生今世 Java NIO 的前生今世 之一 简介 Java NIO 的前生今世 之二 NIO Channel 小结 Java NIO...

永顺
2017/11/29
0
0
小白带你认识netty(三)之NioEventLoop的线程(或者reactor线程)启动(一)

在第一章中,我们看关于NioEventLoopGroup的初始化,我们知道了NioEventLoopGroup对象中有一组EventLoop数组,并且数组中的每个EventLoop对象都对应一个线程FastThreadLocalThread,那么这个...

天空小小
2018/11/22
0
0
JAVA区块链项目实战视频课程

课程介绍 全国首套,基于java的区块链实战教程。目的是让更多的java编程者了解区块链,掌握区块链开发。 1、区块链理论:以node.js例子区块链原理有深刻理解; 2、区块链java实战:深刻理解区...

小红牛
2018/09/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
10
3
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
4
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
5
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
5
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部