`
badqiu
  • 浏览: 673545 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

rapid-framework工具类介绍一: 异步IO类

阅读更多

在一些特殊的场合,我们可能需要使用异步的IO来大幅提高性能.

如日志信息收集.

 

而rapid-framework提供的异步IO类,使用生产者/消费者的多线程同步模式及Decorator模式,如同使用正常的IO一样,只需套多一层AsyncWriter/AsyncOutputStream,即可将普通IO转换为异步IO来使用.

打开一个异步IO后,将会在后台开启一个异步的线程来写数据.

 

异步的Writer使用:

 

 

BufferedWriter writer = new BufferedWriter(new AsyncWriter(new FileWriter("c:/debug.log")));
writer.write("xxxxx");

异步的OutputStream使用:

 

BufferedOutputStream output = new BufferedOutputStream(new AsyncOutputStream(new FileOutputStream("c:/debug.log")));
output.write("foo".getBytes());

 

在output使用完确保output被close,因为在close时,会强制异步线程将数据全部写入最终的targetOutput. 而调用flush()方法则是空操作,不会写数据.

 

异步IO使用tip(1):

可以将BufferedWriter/BufferedOutputStream的缓冲区加大,以减少写入次数.

 

异步IO使用tip(2):

在close异步IO时也放在一个单独的线程中,因为在实际应用场景中,close异步IO可能是十分耗时的操作.

 

 

AsyncWriter实现源码:

public class AsyncWriter extends Writer {

	private static Log log = LogFactory.getLog(AsyncWriter.class);
	
	private static final int DEFAULT_QUEUE_CAPACITY = 50000;
	private final static char[] CLOSED_SIGNEL = new char[0];
	
	private Writer out;
	private DataProcessorThread dataProcessor;
	private boolean isClosed = false;
	private BlockingQueue<char[]> queue ;
	
	private AsyncExceptinHandler asyncExceptinHandler = new DefaultAsyncExceptinHandler();
	private static long threadSeqNumber;
	private static synchronized long nextThreadID() {
		return ++threadSeqNumber;
    }
	
	private class DataProcessorThread extends Thread {
	    
		private boolean enabled = true;
		private boolean hasRuned = false;
		DataProcessorThread() {
			super("AsyncWriter.DataProcessorThread-"+nextThreadID());
			setDaemon(true);
		}

		public void run() {
			hasRuned = true;
			while (this.enabled || !queue.isEmpty()) {
				
				char[] buf;
				try {
					buf = queue.take();
				} catch (InterruptedException e) {
//					e.printStackTrace();
					continue;
				}
				
				if(buf == CLOSED_SIGNEL) {
					return;
				}
				
				try {
					out.write(buf);
				} catch (IOException e) {
					 asyncExceptinHandler.handle(e);
				}
			}
		}
	}

	public AsyncWriter(Writer out) {
		this(out,DEFAULT_QUEUE_CAPACITY,Thread.NORM_PRIORITY + 1);
	}
	
	public AsyncWriter(Writer out,int queueCapacity) {
		this(out,queueCapacity,Thread.NORM_PRIORITY + 1);
	}
	
	public AsyncWriter(Writer out,int queueCapacity,int dataProcesserThreadPriority) {
		this(out,new ArrayBlockingQueue(queueCapacity),dataProcesserThreadPriority);
	}
	
	public AsyncWriter(Writer out,BlockingQueue queue,int dataProcesserThreadPriority) {
		if(out == null) throw new NullPointerException();
		if(queue == null) throw new NullPointerException();
		
		this.queue = queue;
		this.dataProcessor = new DataProcessorThread();
		if(dataProcesserThreadPriority != Thread.NORM_PRIORITY) {
			this.dataProcessor.setPriority(dataProcesserThreadPriority);
		}
		this.dataProcessor.start();
		this.out = out;
	}
	
	public AsyncWriter(Writer out,AsyncExceptinHandler handler) {
		this(out);
		setAsyncExceptinHandler(handler);
	}

	public void write(char[] buf, int offset, int length) throws IOException {
		synchronized (lock) {
			if(isClosed) throw new IOException("already closed");
			try {
				queue.put(BufferCopyUtils.copyBuffer(buf, offset, length));
			} catch (InterruptedException e) {
				throw new IOException("AsyncWriter occer error",e);
			}
		}
	}

	public void close() throws IOException {
		synchronized (lock) {
			try {
				isClosed = true;
				dataProcessor.enabled = false;
				if(queue.isEmpty()) {
					queue.offer(CLOSED_SIGNEL);
				}
				
				try {
					dataProcessor.join();
				} catch (InterruptedException e) {
					//ignore
				}
				
				if(!dataProcessor.hasRuned) {
					dataProcessor.run();
				}
			}finally {
				out.close();
			}
		}
	}
	
	public void flush() throws IOException {
	}

	protected void finalize() throws Throwable {
		super.finalize();
		if(!isClosed) {
			log.warn("AsyncWriter not close:"+this);
			close();
		}
	}

	public void setAsyncExceptinHandler(AsyncExceptinHandler asyncExceptinHandler) {
		if(asyncExceptinHandler == null) throw new NullPointerException();
		this.asyncExceptinHandler = asyncExceptinHandler;
	}

}
 

 

rapid-framework网站:
http://code.google.com/p/rapid-framework

 

在线javadoc:
http://www.rapid-framework.org.cn/rapid-javadoc-v2.0.x/

 

2
0
分享到:
评论
1 楼 wmj2003 2009-06-10  
rapid-validation 如何将自定义校验方法放到rapid-validation的校验之后。

相关推荐

    rapid-framework 整合

    Rapid-Framework 是一个基于Java的轻量级开发框架,它结合了Hibernate、Spring和SpringMVC等流行技术,旨在提供一站式解决方案,帮助开发者快速构建稳定且高效的Web应用。本文将深入探讨Rapid-Framework与Hibernate...

    framework rapid

    文件"rapid-framework-3.9.3.20100923"可能是该框架的一个特定版本,发布于2010年9月23日。这个版本可能包含了框架的所有源代码、文档、示例项目和必要的库文件,供开发者下载使用。开发者可以通过这个版本学习和...

    PyPI 官网下载 | rapid-framework-1.3.0.tar.gz

    在本案例中,我们关注的是名为`rapid-framework`的一个特定版本,即`1.3.0`,它以`.tar.gz`格式压缩。 `.tar.gz`是Linux和Unix系统中常用的文件打包和压缩格式,由`.tar`(归档)和`.gz`(Gzip压缩)组合而成。这种...

    rapid-framework-3.9.3.20100923.jar

    rapid-framework-3.9.3.20100923.jar

    rapid-framework-3.9.2.20100720.zip

    "rapid-framework-3.9.2.20100720.zip"是一个压缩包文件,其中包含了 Rapid-Framework 的特定版本,即3.9.2,发布于2010年7月20日。Rapid-Framework 是一个用于快速开发的应用框架,旨在提高开发效率并简化软件构建...

    rapid-framework 生成后的SSH三层架构

    标题中的"rapid-framework 生成后的SSH三层架构"可能指的是一个快速开发框架,如Rapid Framework,它能自动生成SSH框架的基础结构,帮助开发者快速搭建项目。 Struts2是基于MVC设计模式的Web框架,它负责处理HTTP...

    rapid-framework-3.9.3.20100923

    总结,"Rapid-Framework 3.9.3.20100923"是一个致力于提高开发效率的框架,包含了公共模块的源代码、可直接使用的库文件以及参考文档,提供了一整套工具来简化开发流程,增强代码复用,同时具备良好的性能和安全性。...

    rapid-framework v3.0.1.0 源码

    "Rapid-Framework v3.0.1.0" 是一个专为开发人员设计的高效、易用的代码生成框架,旨在加速应用开发过程,减少重复劳动,提高开发效率。这个框架的核心理念是通过模板引擎生成符合特定业务逻辑的源代码,让开发者...

    rapid-framework-v3.0.1.0及源码

    "Rapid-Framework v3.0.1.0" 是一个专为开发人员设计的高效、易用的软件开发框架,旨在加速应用的构建过程,提高代码质量和开发效率。这个框架可能包含了各种组件和工具,使得开发者能够快速构建出稳定且可扩展的Web...

    rapid-framework-common-3.9.3.20100923-src.zip

    此压缩包中的"rapid-framework-common-3.9.3.20100923"可能包含了Rapid-Framework的公共库源代码,这些源码可能包含了各种通用工具类、常量定义、异常处理、日志记录、线程池管理等,这些都是开发中常用的基础设施。...

    rapid-framework-common-3.9.3.20100923-src doc

    Rapid Framework Common是一个高效、便捷的快速开发框架,版本号为3.9.3,发布日期为2010年9月23日。这个开源项目旨在简化Java Web应用程序的开发过程,通过集成SSH(Struts2、Spring、Hibernate)框架,以及Ibatis...

    rapid-framework 一个类似ruby on rails的java web快速开发脚手架

    "工具"标签则暗示rapid-framework是一个实用工具,能够辅助开发者快速完成Web应用的开发工作。 **文件名称解析:** "rapid-validation"可能是rapid-framework的一个子模块,专注于数据验证。在Web开发中,数据验证...

    最快速的java代码生成器 rapid-generator

    "最快速的Java代码生成器 Rapid-Generator"是一款专为Java开发者设计的高效工具,旨在提升开发效率,减少手动编写重复代码的工作量。这款工具以其快速、灵活和强大的自定义能力在Java开发社区中受到广泛关注。 ...

    standalone-rapid-generator-3.9.2.20100720.zip

    "standalone-rapid-generator-3.9.2.20100720.zip" 是一个用于快速生成代码的独立版本工具包,基于Rapid Framework。这个版本号表明它是2010年7月20日的一个特定构建,3.9.2是其主要版本标识。这个工具的主要目标是...

    rapid-validation完整包

    "Rapid-Validation完整包"是一个专注于前端表单验证的工具集合,包含了样例代码以及所有的CSS和JavaScript文件。这个工具旨在帮助开发者快速、高效地实现网页表单的数据验证,提高用户体验并确保数据的准确性和完整...

    最快速的java代码生成器rapid-generator

    rapid-generator是一个生成器引擎,让你可以专注与代码生成器模板的编写, 可以生成如ibatis,ibatis3,hibernate,spring_mvc,struts2等等代码. 该项目是 Rapid Framework 框架的一部分。

    rapid-generator-v3.9 代码生成器独立版

    《Rapid-Generator v3.9 代码生成器独立版》 在软件开发过程中,代码生成器是一个极其有用的工具,能够极大地提高开发效率并降低出错的...如果你正在寻找一款高效的代码生成工具,那么Rapid-Generator绝对值得尝试。

    最快速的Java代码生成器rapid-generator

    "最快速的Java代码生成器Rapid-Generator"是一款高效能的工具,旨在为开发者提供便捷的Java框架代码自动生成服务。它通过自动化的方式减少了手动编写重复性代码的工作量,提高了开发效率,使得开发者能够更专注于...

    RapidIO-Specification-4.0

    这部分文档详细介绍了RapidIO 4.0在输入/输出逻辑层面的具体要求和技术细节,包括但不限于: - **信号定义**:如何定义和传输信号。 - **数据路径**:数据如何在系统中流动。 - **错误检测与校正**:如何检测和纠正...

    RapidIO学习笔记--互连协议的介绍

    通过阅读"rapidio介绍"和"rapidio_3g"这两个文档,我们可以更深入地理解RapidIO的最新发展,例如3G版本可能引入的新特性和优化,以及如何将这些知识应用于实际的系统设计和实施中。学习RapidIO不仅可以提升对嵌入式...

Global site tag (gtag.js) - Google Analytics