- 浏览: 145349 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
95546772:
我的QQ是 95546772
使用Jencks实现Hibernate与Jackrabbit的分布式事务 -
95546772:
您好,我正在学习jackrabbit.谷歌的连接失效了.能否发 ...
使用Jencks实现Hibernate与Jackrabbit的分布式事务 -
chenjson_chen:
楼主的这个说明,解答了现在项目中遇到的问题
关于Spring嵌套事务 -
beykery:
没必要这么写。。。。
回收DirectByteBuffer -
lc_windson:
楼主,关于这一块,我遇到了一个很困惑的问题,分析.tii文件的 ...
Lucene索引文件解析之“项”
version : netty-3.2.1.final location : org.jboss.netty.channel.socket.nio.NioWorker.read(SelectionKey) 代码片段如下:
ByteBuffer bb = recvBufferPool.acquire(predictedRecvBufSize);
...
if (readBytes > 0) {
bb.flip();
final ChannelBufferFactory bufferFactory =
channel.getConfig().getBufferFactory();
final ChannelBuffer buffer = bufferFactory.getBuffer(
bb.order(bufferFactory.getDefaultOrder()));
recvBufferPool.release(bb);
// Update the predictor.
predictor.previousReceiveBufferSize(readBytes);
// Fire the event.
fireMessageReceived(channel, buffer);
} else {
recvBufferPool.release(bb);
}
ireMessageReceived会最终触发handler的messageReceived方法的调用, 但接收数据的buffer已在此前就归还给了缓存池(recvBufferPool). 其实, bb的回收放在fireMessageReceived之前或之后, 在一般情况下对执行的结果不产生影响, 毕竟在fireMessageReceived执行完毕时, bb也就使用完了. 但是, 若有三个前提条件同时满足时, 就会出现bb被覆写问题. 重现这一陷阱的代码如下:
package cn.cafusic.netty.execution.bug;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.buffer.DirectChannelBufferFactory;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.FixedReceiveBufferSizePredictor;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.channel.socket.nio.NioSocketChannelConfig;
import org.jboss.netty.handler.execution.ExecutionHandler;
/**
* Bug
*
* @author <a href=mailto:jushi@taobao.com>jushi</a>
* @created 2010-8-17
*
*/
public class Bug {
private static class ClientHandler extends SimpleChannelHandler {
@Override
public void messageReceived(final ChannelHandlerContext ctx,
final MessageEvent e) throws Exception {
ChannelBuffer buf = (ChannelBuffer) e.getMessage();
while (buf.readable()) {
System.out.print((char) buf.readByte());
}
System.out.println();
e.getChannel().close();
}
}
private static class ServerHandler extends SimpleChannelHandler {
@Override
public void messageReceived(final ChannelHandlerContext ctx,
final MessageEvent e) throws Exception {
TimeUnit.SECONDS.sleep(1); // delay for buffer rewrite.
e.getChannel().write(e.getMessage());
}
@Override
public void channelConnected(ChannelHandlerContext ctx,
ChannelStateEvent e) throws Exception {
System.out.println("connected : " + e.getChannel());
NioSocketChannelConfig config =
(NioSocketChannelConfig) e.getChannel().getConfig();
config.setBufferFactory(new DirectChannelBufferFactory()); // zero-copy
config.setReceiveBufferSizePredictor(new FixedReceiveBufferSizePredictor(10)); // fix buffer size requirement
}
@Override
public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
System.out.println("closed : " + e.getChannel());
}
}
static void serve() {
final ChannelFactory factory =
new NioServerSocketChannelFactory(Executors.newSingleThreadExecutor(),
Executors.newSingleThreadExecutor(),
1);
final ServerBootstrap bootstrap = new ServerBootstrap(factory);
ChannelPipeline pipeline = bootstrap.getPipeline();
pipeline.addLast("execution",
new ExecutionHandler(Executors.newCachedThreadPool())); // async message received
pipeline.addLast("handler", new ServerHandler());
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);
final Channel bind = bootstrap.bind(new InetSocketAddress(8080));
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("shutdown");
bind.close().awaitUninterruptibly();
bootstrap.releaseExternalResources();
}
});
}
static void connect() {
final ChannelFactory factory =
new NioClientSocketChannelFactory(Executors.newSingleThreadExecutor(),
Executors.newSingleThreadExecutor(),
1);
final ClientBootstrap bootstrap = new ClientBootstrap(factory);
ChannelPipeline pipeline = bootstrap.getPipeline();
pipeline.addLast("handler", new ClientHandler());
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);
ChannelFuture future =
bootstrap.connect(new InetSocketAddress("localhost", 8080));
Channel channel = future.awaitUninterruptibly().getChannel();
channel.write(ChannelBuffers.wrappedBuffer("++++++++++".getBytes()))
.awaitUninterruptibly();
channel.write(ChannelBuffers.wrappedBuffer("----------".getBytes()))
.awaitUninterruptibly();
channel.write(ChannelBuffers.wrappedBuffer("==========".getBytes()))
.awaitUninterruptibly();
channel.getCloseFuture().awaitUninterruptibly();
bootstrap.releaseExternalResources();
}
public static void main(String[] args) {
serve();
connect();
System.exit(0);
}
}
发表评论
-
回收DirectByteBuffer
2011-03-03 10:33 2869为避免GC的负效应, 使用DirectByteBuffer管理 ... -
基于DSL风格的代码重构
2010-10-29 09:32 206什么样代码是简洁易懂, 这很难有个统一的标准, 因为它很 ... -
应用DirectBuffer提升系统性能
2010-08-19 13:01 3295Java 2 SE 6 doc : Given ... -
GWT应用经验小结
2009-03-16 18:29 38931. pendingSrc 问题描述:Image的set ... -
解读《使用Jencks实现Hibernate与Jackrabbit的分布式事务》
2009-01-15 18:15 5554前言 本文是针对《使用Jencks实现Hibernate与 ... -
使用Jencks实现Hibernate与Jackrabbit的分布式事务
2009-01-13 10:40 4366前言 这是一篇用Spring和Jencks ... -
从Erlang看高并发可容错系统设计原则
2008-12-25 18:30 2558《面对软件错误构建可靠的分布系统》 写道 Erlang 的世 ... -
Lucene索引文件解析之“项”
2008-12-23 17:25 1890接上文Lucene索引文件解析之“域”。 关于项(Ter ... -
Mockito入门
2008-12-17 18:35 11455简介 InfoQ-使用Mockito 1.5监视普通对象 ... -
开源让我兴奋
2007-01-08 11:47 865一直在设想自己设计一个java过程自动化的工具,但苦于经验、技 ... -
对象的创建和销毁
2008-08-31 05:23 1036考虑用静态工厂方法代替构造器 静态工厂方法的名字使得调用者 ... -
Jackrabbit 索引配置说明
2008-09-02 00:35 3570从1.4版本之后,jackrabbit开始支持节点的属性索引配 ... -
关于Spring嵌套事务
2008-09-03 05:34 13645不久前,为了避免事务的嵌套,刻意去修改以前的设计,导致各部分之 ... -
教练Marc Lammers语录
2008-09-09 02:06 1087本文摘之InfoQ:世界顶尖 ... -
速度计算有偏差
2008-09-18 01:24 1158团队有4个开发人员,3个测试人员,试行了4天的小迭代,完成的工 ... -
任务板用起来了
2008-09-25 00:53 2294好久就知道任务是个项 ... -
用例编写推荐守则
2008-10-08 07:52 1120没有最佳的用例模板,格式和章节是为用例的内容服务的,它们 ... -
Lucene索引文件解析之“域”
2008-12-12 00:42 2977引言 目前最新的Lucene的版本是2.4.0,但关于索引 ... -
GWT中RequestBuilder使用贴士
2008-12-09 13:35 7657GET请求 String url = // 动态生成 ... -
Failed to resolve artifact
2008-11-30 03:58 6856使用GWT-Maven Archetype (maven-go ...
相关推荐
在本文中,我们将深入探讨如何利用 Netty 4 构建基于 UDP(用户数据报协议)的数据接收服务,以及如何实现相应的发送服务。 首先,UDP 是一种无连接的传输层协议,它不保证数据的顺序或可靠性,但具有较低的开销,...
Netty应用中文详解
这是一个java web项目集成了netty websocket的完整代码。java web项目作为服务器端和客户端进行数据通信。但是常常存在提示Max frame length of 65536 has been exceeded问题。初始化握手对象时指定了...
在Netty中,处理UDP数据接收服务不仅限于上述的基本步骤,还可以利用Netty的丰富功能进行扩展,如添加自定义的协议编解码器、实现负载均衡、健康检查等。总之,Netty为构建高效、灵活的UDP服务提供了一整套强大的...
java netty接收串口数据 开启windows串口工具 发送串口数据调试助手
在本文中,我们将深入探讨 Netty 如何高效地处理客户端连接,以及作者在研究过程中发现的一个影响 Netty 接收连接吞吐量的 Bug。 首先,Netty 使用 NioServerSocketChannel 作为服务器端的通道,它继承自 Java NIO ...
标题中的"C# Netty 客户端,服务器端包含双向接收"揭示了这是一个关于使用C#语言实现基于Netty框架的客户端和服务器端通信的项目。Netty是Java平台上的一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨 Netty 4.1 的中文API帮助文档和用户指南,以及如何利用这些资源来提升你的网络编程...
在本文中,我们将深入探讨Netty中的进制转换和字符编码,并提供解决方案。 首先,我们要明白Netty作为一个高性能的网络应用框架,它本身并不直接处理字符编码,而是通过ByteBuf对象来存储和传输字节流。ByteBuf是...
1. Channel:Netty中的核心组件,表示到实体的开放连接,可以进行读写操作。它可以被打开、关闭、连接或断开连接。 2. 回调和Future:Netty使用回调来处理事件,例如ChannelHandler接口实现。ChannelFuture则提供了...
在 Netty 中,多线程的应用是其处理高并发、高性能的关键因素之一。下面我们将深入探讨 Netty 中的多线程并发应用。 1. **线程模型** Netty 采用了 Boss-Worker 线程模型,它由两部分组成:Boss 线程和 Worker ...
Netty在物联网(IoT)和即时通讯(IM)项目中的应用主要体现在其高效、灵活的网络通信框架特性上。SpringBoot与MQTT 3.1.1的结合,为服务器端开发提供了便利,而Netty作为底层通信库,极大地提升了系统性能。 首先...
通过这个例子,我们可以了解到Netty中的主要组件和它们之间的交互方式,包括EventLoopGroup、Bootstrap、Channel、ChannelPipeline和ChannelHandler。在实际开发中,可以根据需求灵活配置和扩展这些组件,以实现复杂...
在物联网(IoT)和即时通讯(IM)项目中,Netty 的优势得到了广泛应用。本文将深入探讨如何使用 Netty 结合 MQTT 协议在 SpringBoot 框架下构建 IoT 服务器。 **1. MQTT 协议介绍** MQTT(Message Queuing ...
在Netty中,开发一个简单的服务器,如抛弃协议(Discard Protocol)服务器,通常只需要实现处理器中的messageReceived方法来处理接收到的消息,以及exceptionCaught方法来处理异常。抛弃协议是最简单的协议实现,它...
在Netty中,可以通过自定义的 `ChannelInboundHandler` 或 `ChannelOutboundHandler` 来实现特定的数据解码和编码逻辑。例如,可以创建一个 `HexDecoder` 和 `HexEncoder`,分别处理从16进制字符串到字节的转换和...
在Netty中,`ChannelHandler`接口用于处理网络事件,例如读取、写入和异常处理。对于Echo服务器,我们创建了一个名为`EchoServerHandler`的类,继承自`ChannelHandlerAdapter`,因为它提供了一些默认实现,简化了...
在实际项目中,无论是构建TCP/UDP服务器,还是实现Web应用,甚至是处理二进制协议,Netty都能提供强大的支持。 总之,“最新Netty中文文档CHM版”对于想要学习和使用Netty的开发者来说,是一份宝贵的参考资料,它...