注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小葫芦君(汉斯的博客)

博客迁移到新博客:https://blog.ssxingshou.com

 
 
 

日志

 
 
关于我

小小葫芦商城,为您提供高品质的商品,一流的产品,一流的包装服务,一流的物流服务,放心购买

网易考拉推荐

Netty 4.0 新的特性及需要注意的地方 5  

2014-04-11 21:54:45|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

简化的关闭

releaseExternalResources()不必再用了。你可以通过调用EventLoopGroup.shutdown()直接地关闭所有打开的连接同时使所有I/O线程停止,就像你使用java.util.concurrent.ExecutorService.shutdown()关闭你的线程池一样。

类型安全的ChannelOptions

有两个方法来配置Netty的Channel的socket参数。第一个是明确地调用ChannelConfig的setter,例如SocketChannelConfig.setTcpNoDelay(true)。这是最为类型安全的方法。另外一个是调用ChannelConfig.setOption()方法。有时候你不得不决定在运行时的时候socket要配置什么选项,同时这个方法在这种情况下有点不切实际。然而,在3.x里它是容易出错的,因为一个用户必需用一对字符串和对象来指定选项。如果用户调用了错误的选项名或者值,他或她将会赵宇到一个ClassCastException或指定的选项甚至可能会默默地忽略了。

4.0引入了名为ChannelOption的新的类型,它提供了类型安全地访问socket选项。

01ChannelConfig cfg = ...;
02  
03// Before:
04cfg.setOption("tcpNoDelay"true);
05cfg.setOption("tcpNoDelay"0);  // Runtime ClassCastException
06cfg.setOption("tcpNoDelays"true); // Typo in the option name - ignored silently
07  
08// After:
09cfg.setOption(ChannelOption.TCP_NODELAY, true);
10cfg.setOption

(ChannelOption.TCP_NODELAY, 
0); // Compile error

AttributeMap

在回应用户指令里,你可以附加任意的对象到Channel和ChannelHandlerContext。一个名为AttributeMap的新接口被加入了,它被Channel和ChannelHandlerContext继承。作为替代,ChannelLocal和Channel.attachment被移除。这些属性会在他们关联的Channel被垃圾回收的同时回收。

01public class MyHandler extends ChannelInboundMessageHandlerAdapter<MyMessage> {
02  
03    private static final AttributeKey<MyState> STATE =
04            new AttributeKey<MyState>("MyHandler.state");
05  
06    @Override
07    public void channelRegistered(ChannelHandlerContext ctx) {
08        ctx.attr(STATE).set(new MyState());
09        ctx.fireChannelRegistered();
10    }
11  
12    @Override
13    public void messageReceived(ChannelHandlerContext ctx, MyMessage msg) {
14        MyState state = ctx.attr(STATE).get();
15    }
16    ...
17}


新的bootstrap API

bootstrap API已经重头重写,尽管它的目的还是一样;它执行需要使服务器或客户端运行的典型步骤,通常能在样板代码里找到。新的bootstrap同样采取了流畅的接口。

01public static void main(String[] args) throws Exception {
02    // Configure the server.
03    ServerBootstrap b = new ServerBootstrap();
04    try {
05        b.group(new NioEventLoopGroup(), new NioEventLoopGroup())
06         .channel(new NioServerSocketChannel())
07         .option(ChannelOption.SO_BACKLOG, 100)
08         .localAddress(8080)
09         .childOption(ChannelOption.TCP_NODELAY, true)
10         .childHandler(new ChannelInitializer<SocketChannel>() {
11             @Override
12             public void initChannel(SocketChannel ch) throws Exception {
13                 ch.pipeline().addLast(handler1, handler2, ...);
14             }
15         });
16  
17        // Start the server.
18        ChannelFuture f = b.bind().sync();
19  
20        // Wait until the server socket is closed.
21        f.channel().closeFuture().sync();
22    finally {
23        // Shut down all event loops to terminate all threads.
24        b.shutdown();
25    }
26}

ChannelPipelineFactory → ChannelInitializer

和你在上面的例子注意到的一样,ChannelPipelineFactory不再存在了。而是由ChannelInitializer来替换,它给予了在Channel和ChannelPipeline的配置的更多控制。

请注意,你不能自己创建一个新的ChannelPipeline。通过观察目前为止的用例报告,Netty项目队伍总结到让用户去创建自己的管道实现或者是继承默认的实现是没有好处的。因此,ChannelPipeline不再让用户创建。ChannelPipeline由Channel自动创建。

ChannelFuture拆分为ChannelFuture和ChannelPromise

ChannelFuture已经被拆分为ChannelFuture和ChannelPromise了。这不仅仅是让异步操作里的生产者和消费者间的约定更明显,同样也是得在使用从链中返回的ChannelFuture更加安全,因为ChannelFuture的状态是不能改变的。

由于这个编号,一些方法现在都采用ChannelPromiser而不是ChannelFuture来改变它的状态。

  评论这张
 
阅读(536)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017