您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 基于线程池的数据采集器在网管中的应用
摘要:本文针对网络管理中对采集器的实时性要求,设计并实现了一个基于线程池的高效网络管理数据采集器。其中详细讨论了它的各项关键技术--Java5线程池、类的动态装载和消息队列--以及由此所带来的通用多用途性、模块化、可扩展和可移植等特性。关键词:线程池,动态装载,采集器,网络管理1.引言随着Internet的迅猛发展,为了能够提供可靠而灵活的网络服务,网络管理与监控越来越成为一个突出的问题。被管理网络变得越来越庞大,网络提供的服务也越来越多样化,因而对网管服务器采集和处理数据的实时能力的要求也越来越高。网络数据采集一般采用多线程技术来提高采集效率。但是在网络管理中,需要频繁的处理用户请求而每次请求需要的服务时间又很简短。此时,系统会将大量的时间花费在线程的创建与销毁上。Java5的线程池克服了这些缺点。通过对重用线程来执行多个任务,避免了频繁的线程创建与销毁的开销,能使得采集服务器的性能得到很大提高[1]。本文就是利用Java5中的并发线程池技术,设计了一个通用的多用途数据采集器,并应用在综合网管中,较之以前,在性能上有了很大的提高。2.Java5并发集合工具包java.util.concurrent的简介2.1三个新加的多线程工具包Java5中新加入了三个多线程包:java.util.concurrent,java.util.concurrent.atomic,java.util.concurrent.locks。java.util.concurrent包含了常用的多线程工具,是新的多线程工具的主体。java.util.concurrent.atomic包含了不用加锁情况下就能改变值的原子变量,比如说AtomicInteger提供了addAndGet()方法。Add和Get是两个不同的操作,为了保证别的线程不干扰,以往的做法是先锁定共享的变量,然后在锁定的范围内进行两步操作。但用AtomicInteger.addAndGet()就不用担心锁定的事了,其内部实现保证了这两步操作是在原子量级发生的,不会被别的线程干扰。java.util.concurrent.locks包包含锁定的工具。2.2新的任务执行架构在Java5.0之前启动一个任务是通过调用Thread类的start()方法来实现的,任务的提于交和执行是同时进行的,如果你想对任务的执行进行调度或是控制同时执行的线程数量就需要额外编写代码来完成。5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接池的线程池来执行任务。这个架构主要有三个接口和其相应的具体类组成。这三个接口是Executor,ExecutorService和ScheduledExecutorService,其关系如图1所示。线程池接口关系图图的左侧是接口,图的右侧是这些接口的具体类。注意Executor是没有直接具体实现的。Executor接口:是用来执行Runnable任务的,它只定义一个方法――execute(Runnablecommand),其功能是执行Ruannable类型的任务。ExecutorService接口:它继承了Executor的方法,并提供了执行Callable任务和中止任务执行的服务。ScheduledExecutorService接口:它在ExecutorService的基础上,提供了按时间安排执行任务的功能。Executors类:虽然以上提到的接口有其实现的具体类,但为了方便,Java5.0建议使用Executors的工具类来得到Executor接口的具体对象,需要注意的是Executors是一个类,不是Executor的复数形式。Executors提供了以下一些static的方法:newCachedThreadPool():产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用;newFixedThreadPool(intpoolSize):产生一个ExecutorService对象,这个对象带有一个大小为poolSize的线程池,若任务数量大于poolSize,任务会被放在一个queue里顺序执行;newScheduledThreadPool(intpoolSize):产生一个ScheduledExecutorService对象,这个对象的线程池大小为poolSize,若任务数量大于poolSize,任务会在一个queue里等待执行。在我们设计的网管采集器中,就是利用Executors类的newScheduledThreadPool(intpoolSize)方法产生一个具有足够线程数的线程池来执行各种各样的数据采集任务。较之一般的多线程技术,线程池主要用于单个任务处理的时间很短而请求的数目却十分巨大的场合,以消除频繁的创建和销毁线程的开销,从而达到提高实时性能的目的。除了创建和销毁线程的开销之外,活动的线程也消耗系统资源。在一个JVM里创建太多的线程可能会导致系统由于过度消耗内存而用完内存或“切换过度”。为了防止资源不足,服务器应用程序需要一些办法来限制任何给定时刻处理的请求数目。线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。其好处是,因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。而且,通过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从而可以防止资源不足。由于线程池是与业务无关的,并且经常会遇到诸如同步错误和死锁等并发风险,并且以及资源不足和线程泄漏等风险,自己从头开发定制的线程池并没有优势可言,因此利用java并发工具包这样成熟的线程池技术是应用开发的首选。3.采集器的设计采集器是综合网管服务器软件中的一个模块,主要负责采集网络中被管设备或下层网管中的管理数据,管理数据也通过采集器配置到被管设备或下层网管中。考虑到采集器模块的相对独立性以及将来可能独立部署成一个综合的采集服务器,我们设计了网管服务器与采集器之间明确的通信接口――JMS消息中间件,其中设计了Server消息队列(网管服务器向采集器发送消息Bean格式的采集或取消命令)和Collector队列(采集器把采集到的数据转换成与采集协议无关的统一格式的消息Bean并发送给网管服务器)。通过JMS消息中间件,实现了采集器和网管服务器的解耦。有关JMS中间件的介绍可参见参考文献[2]基于JMS的数据推送系统的设计与实现。整个采集器模块框图2所示。包括一个消息收发器线程、一个消息处理器以及RunnableJob接口。消息收发器比较简单,主要负责消息的接收并通知消息处理器,以及消息的发送。消息处理器实现了观察者接口,负责消息的处理、通过线程池调用RunnableJob启动采集,并调用消息收发器的发送方法向网管服务器返回采集到的数据。由于采集常常涉及到一些轮询的工作,需要频繁的处理用户请求而每次请求需要的服务时间又很简短,所以非常适用线程池来处理。RunnableJob接口继承了Runnable接口,对应于线程池中的一个线程,负责具体的采集工作,并转换成网管服务器所要求的与具体采集协议无关的消息。需要注意的是,实现RunnableJob接口是网管服务器一方的任务,采集器一方只是预装了各种各样的采集包,而并不需要了解网管服务器一方在运行时到底采用哪一个采集包。这里用到了Java类的动态装载机制。Java类的动态装载机制是JVM的一项核心技术,可以在不影响系统其它功能模块正常运行的同时动态地加载或替换系统的某些功能模块[3]。装载通过寻找一个类或一个接口的二进制形式来构造代表这个类或这个接口的class对象,其中类或接口的名称已给定。多数情况下,JVM使用类路径机制来搜索你在代码中引用的但尚未载入运行时的类。类路径是系统用来寻找类文件的一系列位置列表。但Java类的动态装载机制的更强大之处是它能够从对应用程序有意义的地方例如一个远程计算机载入类[4]。我们的采集器中,消息处理器就是通过在运行时从网管服务器传过来的RunnableJob的类字节码来动态创建它的对象的。图2采集器设计框图4.采集器的特点4.1高效性基于线程池技术的采集器,消除了线程创建和销毁的开销,提高了采集效率。4.2通用性由于RunnableJob是与采集无关的,所以采集器的通用性表现在两个方面。第一,采集器可以适用于各种各样的采集任务,目前在我们的网管服务器的设计中,针对不同的被管网络或下层网管就实现了SNMP、CORBA、Socket等协议实现了网络管理有关的采集任务。第二,在我们的网络管理中,“Collector”表现为采集器(池),而也正是由于RunnableJob是与采集无关的,所以,任何适用于线程池的场合,都可以应用我们的“Collector”,“Collector”还可以表现为Web服务器的连接池、并行计算池等等。4.3通过JMS消息队列实现与Server的隔离5.结束语本文提出了一种基于线程池的通用数据采集器的实现方案,并应用于综合网络管理软件的设计开发中,取得了较好的效果。该方案主要包括一个消息收发器线程、一个消息处理器以及RunnableJob接口。该设计方案利用了Java类的动态装载技术、线程池技术以及消息中间件JMS实现了通用多用途的高效的数据采集,并实现了与网管服务器的松散耦合,具有相对的模块独立性,为以后的扩展和移植提供了便利。参考文献[1]王华,马亮,顾明.线程池技术研究与应用[J].计算机应用研究,2005,(11).[2]汪红兵,佘春东,范植华,李磊,徐帆江,.基于JMS的数据推送系统的设计与实现[J].计算机应用,2005,(S1).[3]黄晓平,.Java虚拟机中类装载机制的原理与应用[J].软件导刊,2006,(1).[4]Arnold,Gosting,Holmes.TheJavaProgrammingLanguage,ThirdEdition[M].虞万荣,王玉峰,赵亮,.北京:中国电力出版社,2003
本文标题:基于线程池的数据采集器在网管中的应用
链接地址:https://www.777doc.com/doc-2576284 .html