`

使用Apache的Commons-Collection库中提供的BlockingBuffer实现数据异步处理

阅读更多

 


数据异步处理是常见的需求。假设一下场景: 

系统可能存在大量的数据并发写入某文件或某数据库表,而写入时还有相关业务处理,但是写入的结果对写入人来说毫不关心,无论是否写入成功都不重要,也不需要他立刻写入,慢慢写也可以。 

于是,我们可以用一种思路来解决,即创建一个队列,外部代码只负责将要处理的数据写入该队列,另有一个线程,尝试清空该队列,也就是处理数据。 

这就是一个比较简单的生产者和消费者的多线程模式,只是只有一个消费者,生产者很多。 


对于这种模式Apache开源库中的commons-collections中的Buffer,尤其是BlockingBuffer很好的实现了我们所说的这个队列。 

这个队列提供了一个"remove"方法,尝试获得队列中的数据,如果这个队列为空,这个方法将会阻塞,直到有数据为止。 

接下来,我们可以将这个逻辑封装为以下类:写道
public class DataDealer
{
    private final Buffer dataBuffer; // 数据buffer,因为使用匿名类,所以声明为final

    public DataDealer()
    {
        // 初始化阻塞队列,原始队列是一个无边界的先进先出队列,也是Apache的同一个库中提供的
        dataBuffer = BlockingBuffer.decorate( new UnboundedFifoBuffer(  ) );

        // 创建数据处理线程
        Thread dealThread = new Thread( new Runnable()
        {
            public void run()
            {
                while ( true )   // 永远尝试获得数据并处理,因此死循环
                {
                    System.out.println( "尝试获取要处理的数据" );
                    Object toDeal = dataBuffer.remove(); // 如果拿不到数据,就会阻塞
                    System.out.println( "dealing:" + toDeal ); // 真正的业务处理代码就在这里
                    System.out.println( "数据处理完毕" );
                }
            }
        }, "数据处理线程" );

        dealThread.setDaemon( true );  // 将这个数据处理线程设置为守护线程,如果主线程退出,那么个数据处理线程也自动退出
        dealThread.start();  // 启动这个线程
    }

    // 外部业务方法就简单了,调用这个方法提交一个要处理的对象,其实现逻辑只是将其加入队列而已
    public void addDataToWrite( Object toWhite )
    {
        dataBuffer.add( toWhite );
    }

}

 以上代码有一个注意事项,就是这个对象每创建一次就会发起一个线程,实际使用中,应该对其进一步改进,实现单例模式。

 

分享到:
评论

相关推荐

    apache-commons-id.jar和commons-discovery-0.2.jar

    Apache Commons ID 和 Commons Discovery 是两个在Java开发中广泛使用的开源库,它们是Apache软件基金会的项目,为开发者提供了丰富的工具和功能。 Apache Commons ID 主要关注于生成唯一标识(ID)的功能,它提供...

    Apache commons-io-2.5.jar

    "commons-io-2.5.jar"是Apache Commons IO库的一个版本,针对JDK 1.6及更高版本设计。在这个版本中,用户可以找到许多优化和增强的功能。 1. **IOUtils**: IOUtils是Apache Commons IO中的核心类之一,它提供了大量...

    commons-beanutils、commons-collections、commons-collections等常用jar 包下载

    Apache Commons 是一系列小型实用工具库,为Java开发者提供了丰富的功能扩展。这些库简化了常见的编程任务,提高了开发效率。在给定的压缩包文件中,包含的三个jar包分别是: 1. **Apache Commons BeanUtils** - `...

    apache commons 常用jar包 commons-validator commons-transaction commons-lang等

    jar包大小:135KB commons-validator-1.3.1.jar jar包大小:93KB commons-transaction-1.2.jar jar包大小:141KB commons-scxml-0.6.jar jar包大小:254KB commons-primitives-1.0.jar jar包大小:60KB commons-pool-1.3....

    commons-math3-3.5-API文档-中文版.zip

    赠送jar包:commons-math3-3.5.jar; 赠送原API文档:commons-math3-3.5-javadoc.jar; 赠送源代码:commons-math3-3.5-sources.jar; 赠送Maven依赖信息文件:commons-math3-3.5.pom; 包含翻译后的API文档:...

    apache-commons源码及jar文件

    Commons-Lang 提供了许多许多通用的工具类集,提供了一些java.lang中类的扩展功能 Latka Commons-Latka 是一个HTTP 功能测试包,用于自动化的QA,验收和衰减测试. Launcher Launcher 组件是一个交叉平台的Java 应用...

    apache-commons-codec-1.4.jar和sun.misc.BASE64Encoder.jar

    在给定的压缩包文件中,`apache-commons-codec-1.4.jar`是这个库的一个版本,它包含了对BASE64以及其他编码格式的支持。 BASE64是一种用于将二进制数据转换为ASCII文本的编码方式,以便在不支持二进制传输的环境中...

    Apache commons-csv-1.6 jar

    Apache commons-csv-1.6 jar包,java7,针对csv的各种操作,需要的下载

    apache commons-net-3.5.jar

    使用apache commons-net包实现文件ftp上传

    commons-text-1.9-API文档-中英对照版.zip

    赠送jar包:commons-text-1.9.jar; 赠送原API文档:commons-text-1.9-javadoc.jar; 赠送源代码:commons-text-1.9-sources.jar; 赠送Maven依赖信息文件:commons-text-1.9.pom; 包含翻译后的API文档:commons-...

    Apache Commons-logging使用实例

    Apache Commons-logging 是一个流行的Java日志记录库,提供了一个轻量级的日志记录接口,允许开发者使用不同的日志实现工具。下面是对 Apache Commons-logging 的使用实例的详细介绍。 1. Commons-Loggin 简介 ...

    commons-lang3-3.4-API文档-中文版.zip

    赠送jar包:commons-lang3-3.4.jar; 赠送原API文档:commons-lang3-3.4-javadoc.jar; 赠送源代码:commons-lang3-3.4-sources.jar; 赠送Maven依赖信息文件:commons-lang3-3.4.pom; 包含翻译后的API文档:...

    apache commons jar(commons所有的jar包,从官网下载提供给大家)

    daemon-1.0.15-bin commons-dbutils-1.6-bin commons-digester3-3.2-bin commons-el-1.0 commons-email-1.4-bin commons-fileupload-1.0 commons-fileupload-1.1.1 commons-fileupload-1.1 commons-file upload-...

    commons-lang3-3.10-API文档-中文版.zip

    赠送jar包:commons-lang3-3.10.jar; 赠送原API文档:commons-lang3-3.10-javadoc.jar; 赠送源代码:commons-lang3-3.10-sources.jar; 赠送Maven依赖信息文件:commons-lang3-3.10.pom; 包含翻译后的API文档:...

    commons-pool2-2.0-API文档-中文版.zip

    赠送jar包:commons-pool2-2.0.jar; 赠送原API文档:commons-pool2-2.0-javadoc.jar; 赠送源代码:commons-pool2-2.0-sources.jar; 赠送Maven依赖信息文件:commons-pool2-2.0.pom; 包含翻译后的API文档:...

    commons-dbcp-1.2.1.jar + commons-pool-1.4.jar + commons-collections-3.2.jar

    本主题将详细解析标题和描述中提及的三个核心库:`commons-dbcp-1.2.1.jar`、`commons-pool-1.4.jar`以及`commons-collections-3.2.jar`,它们如何协同工作以提供高效的数据库连接管理服务。 1. **Apache Commons ...

    commons-compress-1.21-API文档-中文版.zip

    赠送jar包:commons-compress-1.21.jar; 赠送原API文档:commons-compress-1.21-javadoc.jar; 赠送源代码:commons-compress-1.21-sources.jar; 赠送Maven依赖信息文件:commons-compress-1.21.pom; 包含翻译后...

    commons-collections4-4.1-API文档-中文版.zip

    赠送jar包:commons-collections4-4.1.jar; 赠送原API文档:commons-collections4-4.1-javadoc.jar; 赠送源代码:commons-collections4-4.1-sources.jar; 赠送Maven依赖信息文件:commons-collections4-4.1.pom;...

    commons-lang3-3.9-API文档-中文版.zip

    赠送jar包:commons-lang3-3.9.jar; 赠送原API文档:commons-lang3-3.9-javadoc.jar; 赠送源代码:commons-lang3-3.9-sources.jar; 赠送Maven依赖信息文件:commons-lang3-3.9.pom; 包含翻译后的API文档:...

    apache commons jar(commons所有的jar包,从官网下载提供.zip

    apache commons jar(commons所有的jar包... apache-sanselan-incubating-0.97-bin bcel-5.2 commons-beanutils-1.9.2-bin commons-chain-1.2-bin commons-cli-1.3.1-bin commons-codec-1.10-bin commons-collections4-4

Global site tag (gtag.js) - Google Analytics