Java后台服务程序设计.docx
《Java后台服务程序设计.docx》由会员分享,可在线阅读,更多相关《Java后台服务程序设计.docx(16页珍藏版)》请在冰豆网上搜索。
![Java后台服务程序设计.docx](https://file1.bdocx.com/fileroot1/2022-10/26/036c6584-c611-4f4c-9552-aeeb72be0969/036c6584-c611-4f4c-9552-aeeb72be09691.gif)
Java后台服务程序设计
Java后台服务程序设计
在很多大型软件项目中,都有一些极为重要的后台服务程序,它们并不处理具体的系统业务逻辑,但对整个系统资源和服务的协调管理却是不可或缺。
本文讨论如何完整地编写一个后台服务管理程序,并通过一个具体的后台服务管理例子来说明这一技术实现的技巧。
为什么需要后台服务程序?
在许多大型软件项目中,后台服务程序都扮演着极为重要的角色。
它们无处不在,例如操作系统的内核程序处理各种对操作系统的内部调用;数据库系统的核心管理进程处理各种对数据库的读写操作和进程、资源的管理;大型ERP软件的内核管理程序要完成各种应用模块的资源、通讯管理等等。
它们使系统的各种服务、资源与应用的表示之间形成了一个松耦合关系,这样就极大地增加了软件系统的稳定性和伸缩性。
后台服务程序也就是相当于软件系统的管理调度中心,它是软件系统的中央处理器,是保证应用高效运行的内核程序。
在不同的软件系统中,由于软件的复杂程度和功能的不同使得各种软件系统的后台服务程序都有存在较大的差异。
但是后台服务程序还是有很多共同的特点,一个基本的后台服务程序大概可以由四个部分构成:
通用服务器框架、服务与监听、服务控制、服务器实现。
下面我们就使用具体的代码来实现一个基本的后台服务器程序。
通用服务器框架
在开发后台服务程序中,我们首先实现一个通用服务器框架类,它能在多个端口提供多线程的服务(由多个Service对象定义),并且能够在系统运行时动态地调用和实例化Service类并加载新的服务或卸除已加载的服务。
清单1显示了如何编制一个通用服务器框架类文件。
【清单1:
通用服务器框架类文件Server.java】
importjava.util.*;
importjava.io.*;
import.*;
publicclassServer{
protectedMapservices;
Setconnections;
intmaxConnections;
intfreeConn;
ThreadGroupthreadGroup;
privateintcurrentConn;
privatePrintWriterlog=newPrintWriter(System.out,true);
publicbooleanconnected=false;
publicPropertiesproPort,proNum;
publicsynchronizedvoidsetControlFlag(){
connected=true;
}
publicsynchronizedvoidremoveControlFlag(){
connected=false;
}
publicvoidsetProperty(PropertiesproPort,PropertiesproNum){
this.proPort=proPort;
this.proNum=proNum;
}
publicServer(intmaxConn){
this.maxConnections=maxConn;
this.freeConn=maxConnections;
this.threadGroup=newThreadGroup(;
currentConn=0;
this.services=newHashMap();
this.connections=newHashSet(maxConnections);
}
publicsynchronizedvoidaddService(Serviceservice,intport,intmaxConn)throwsIOException{
Stringservicename=service.getClass().getName();
Integerkey=newInteger(port);
if(services.get(key)!
=null)thrownewIllegalArgumentException("端口:
"+port+"已经被占用!
");
if(getfreeConnections(maxConn)>=0){
Listenerlistener=newListener(this,port,service,maxConn);
services.put(key,listener);
log.println("启动"+servicename+"服务在"+port+"端口上");
listener.start();
}else{
"系统并发连接限制已经达到最大值!
");
"服务"+servicename+"启动失败!
");
}
}
publicsynchronizedvoidaddService(Serviceservice,intport)throwsIOException{
this.addService(service,port,10);
}
publicsynchronizedbooleanremoveService(intport){
Integerkey=newInteger(port);
intmaxConn=10;
finalListenerlistener=(Listener)services.get(key);
if(listener==null){
log.println("Service"+"isn'tstartedonport"+port);
returnfalse;
}
services.remove(key);
listener.pleaseStop();
freeConn+=listener.maxConn;
log.println("Close"+listener.service+"onport"+port);
returntrue;
}
publicsynchronizedvoiddisplayStatus(PrintWriterout){
Iteratorkeys=services.keySet().iterator();
while(keys.hasNext()){
Integerport=(Integer)keys.next();
Listenerlistener=(Listener)services.get(port);
out.println("服务"+listener.service+"运行"+port+"\n");
}
out.println("连接限制为"+maxConnections);
Iteratorconns=connections.iterator();
while(conns.hasNext()){
Sockets=(Socket)conns.next();
intsport=s.getLocalPort();
Listenerlisten=(Listener)services.get(newInteger(sport));
Stringservicename=listen.service;
out.println(servicename+"响应请求在"+s.getInetAddress().getHostAddress()+"的"+sport+"端口上");
}
out.println("当前连接数为"+currentConn);
out.println("当前系统空闲连接数为"+freeConn);
}
privatesynchronizedintgetfreeConnections(intmaxConn){
intnum=-1;
if(freeConn>=maxConn){
freeConn-=maxConn;
num=freeConn;
}
returnnum;
}
publicsynchronizedintgetConnections(){
returncurrentConn;
}
publicsynchronizedintaddConnections(Sockets){
connections.add(s);
returncurrentConn++;
}
publicsynchronizedintremoveConnections(Sockets){
connections.remove(s);
try{
s.close();
}catch(Exceptione){
;
}
returncurrentConn--;
}
publicsynchronizedintgetConnections(intconnections){
intnum=0;
if((num=freeConn-connections)>=0){
freeConn=num;
}elsenum=-1;
returnnum;
}
privatesynchronizedintgetFreeConn(){
returnfreeConn;
}
}
如上所述可知,服务器框架类Server主要是通过端口到监听器影射的散列表services来管理服务对象,Server类的几个主要方法说明如下:
∙addService方法:
此方法能够在特定的端口上创建新的服务,即在指定端口上运行指定的Service对象。
∙removeService方法:
此方法使服务器停止指定端口上的服务,并不终止连接,仅使服务器停止接受新的连接。
∙displayStatus方法:
此方法用于打印指定流上服务器的状态信息。
服务与监听
每个服务都对应着一个监听对象,监听指定端口的连接并在获得连接请求时调用addConnection(Sockets,Serviceservice)方法来取得(释放)一个连接。
清单2显示了如何编制一个监听类文件。
【清单2:
Listener.java的一个简单实现】
importjava.util.*;
importjava.io.*;
import.*;
publicclassListenerextendsThread{
privateServerSocketlistener;
privateintport;
Stringservice;
Setconnections;
privateServicerunService;
privatebooleanstop_flag=false;
intmaxConn;
privatePrintWriterlog=newPrintWriter(System.err,true);
privateThreadGroupgroup;
privateintcurrentConnection