- 浏览: 143585 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 2833为避免GC的负效应, 使用DirectByteBuffer管理 ... -
基于DSL风格的代码重构
2010-10-29 09:32 206什么样代码是简洁易懂, 这很难有个统一的标准, 因为它很 ... -
应用DirectBuffer提升系统性能
2010-08-19 13:01 3237Java 2 SE 6 doc : Given ... -
GWT应用经验小结
2009-03-16 18:29 38581. pendingSrc 问题描述:Image的set ... -
解读《使用Jencks实现Hibernate与Jackrabbit的分布式事务》
2009-01-15 18:15 5507前言 本文是针对《使用Jencks实现Hibernate与 ... -
使用Jencks实现Hibernate与Jackrabbit的分布式事务
2009-01-13 10:40 4318前言 这是一篇用Spring和Jencks ... -
从Erlang看高并发可容错系统设计原则
2008-12-25 18:30 2523《面对软件错误构建可靠的分布系统》 写道 Erlang 的世 ... -
Lucene索引文件解析之“项”
2008-12-23 17:25 1849接上文Lucene索引文件解析之“域”。 关于项(Ter ... -
Mockito入门
2008-12-17 18:35 11400简介 InfoQ-使用Mockito 1.5监视普通对象 ... -
开源让我兴奋
2007-01-08 11:47 812一直在设想自己设计一个java过程自动化的工具,但苦于经验、技 ... -
对象的创建和销毁
2008-08-31 05:23 978考虑用静态工厂方法代替构造器 静态工厂方法的名字使得调用者 ... -
Jackrabbit 索引配置说明
2008-09-02 00:35 3538从1.4版本之后,jackrabbit开始支持节点的属性索引配 ... -
关于Spring嵌套事务
2008-09-03 05:34 13613不久前,为了避免事务的嵌套,刻意去修改以前的设计,导致各部分之 ... -
教练Marc Lammers语录
2008-09-09 02:06 1060本文摘之InfoQ:世界顶尖 ... -
速度计算有偏差
2008-09-18 01:24 1086团队有4个开发人员,3个测试人员,试行了4天的小迭代,完成的工 ... -
任务板用起来了
2008-09-25 00:53 2270好久就知道任务是个项 ... -
用例编写推荐守则
2008-10-08 07:52 1096没有最佳的用例模板,格式和章节是为用例的内容服务的,它们 ... -
Lucene索引文件解析之“域”
2008-12-12 00:42 2936引言 目前最新的Lucene的版本是2.4.0,但关于索引 ... -
GWT中RequestBuilder使用贴士
2008-12-09 13:35 7625GET请求 String url = // 动态生成 ... -
Failed to resolve artifact
2008-11-30 03:58 6828使用GWT-Maven Archetype (maven-go ...
相关推荐
Netty应用中文详解
基于netty 的udp字节数据接 收服务,发送服务实例 基于netty 的udp字节数据接收服务,发送服务实例
这是一个java web项目集成了netty websocket的完整代码。java web项目作为服务器端和客户端进行数据通信。但是常常存在提示Max frame length of 65536 has been exceeded问题。初始化握手对象时指定了...
java实现基于netty 的utp字节数据接收服务,服务具体实现代码。样例java实现基于netty 的utp字节数据接收服务,服务具体实现代码。样例
java netty接收串口数据 开启windows串口工具 发送串口数据调试助手
Netty堆缓存问题1、问题描述2、问题分析3、问题解决4、总结 1、问题描述 今天学习Netty堆缓存和直接缓存遇到一个问题,明明使用的是堆缓存,这么读取不到数据呢?打印日志一看heapBuf.hasArray()直接返回false。...
netty 物联网iot中mqtt 服务器端开发,主要是使用技术springboot+mqtt3.1.1+netty
在公司做项目的时候发现用Netty进行TCP/IP通信的Netty客户端接收到的数据进制乱码,经过摸索,终于成功解决了这个鸡肋的问题
netty 物联网iot中mqtt 服务器端开发,主要是使用技术springboot+mqtt3.1.1+netty
netty中的多线程并发应用,
Netty 框架学习 —— 第一个 Netty 应用(csdn)————程序
Netty_中文技术文档,Netty操作指南
抓到 Netty 一个 Bug,顺带来透彻地聊一下 Netty 是如何高效接收网络连接的.doc
netty案例,netty4.1中级拓展篇十《Netty接收发送多种协议消息类型的通信处理方案》源码 ...
多线程并发编程在Netty中的应用分析
netty 4.1中文.CHM,chm格式,中文api,开发netty的中文工具书
这个问题在JDK 1.7版本中还没有被完全解决,但是Netty已经将这个bug进行了处理。 这个Bug与操作系统机制有关系的,JDK虽然仅仅是一个兼容各个操作系统平台的软件,但在JDK5和JDK6最初的版本中(严格意义上来将,JDK...
netty 4.1 中文.CHM,开发netty的中文工具书 帮助文档,中文版netty
一个最简单的netty应用 使用:运行EchoServer,打开cmd命令窗口。输入telnet localhost 8080.成功连接后,输入字符,可在ide的控制台输出。 3.第二个示例 com.time’ Netty服务端与客户端,数据的发送与接收 ...
Netty在Android开发中的应用实战系列(一)——— 搭建服务端与客户端:https://azhon.blog.csdn.net/article/details/100569489 Netty在Android开发中的应用实战系列(二)——— Encoder | Decoder | Handler 的...