📄 server.java
字号:
package com.gctech.sms.platform;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.Vector;
import org.apache.log4j.Logger;
import EDU.oswego.cs.dl.util.concurrent.Executor;
import EDU.oswego.cs.dl.util.concurrent.ThreadedExecutor;
import com.gctech.sms.SmsException;
import com.gctech.sms.app.AppReceiver;
import com.gctech.sms.msg.GatewayType;
import com.gctech.sms.msg.MTAck;
import com.gctech.sms.msg.MTInfo;
import com.gctech.sms.tj.ReadMTPool;
import com.gctech.sms.util.ConnectionManager;
import com.gctech.sms.util.ThreadManager;
import com.gctech.util.Startable;
import com.gctech.util.net.AbstractConcurrentServer;
import com.gctech.util.net.ConcurrentServer;
/**
* 短信平台
* <p>短信平台</p>
* <p>建立mo、mt、管理线程 </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: TOL24.com</p>
* @author not attributable
* @version $Id: Server.java,v 1.4 2004/05/24 01:08:01 wanghb Exp $
*/
public class Server {
private List servers;
private String fileName = "./conf/server.properties";
public static final String CONFIG_PREFIX = "gcsms.server.";
private Map moGateway = null;
private Map mtGateway = null;
private Map mtList;
/**
* 根据下行回复移除一个下行信息。
* */
public Object removeMt(MTAck key) {
return mtList.remove(key.msgId);
}
/**
* 发送消息,并记录到已发送列表。
* */
public int sentMt(MTInfo info, int gateway) {
//业务修改,移动和联通都发到移动网关 2004-4-26 wjl change
//Object obj = mtGateway.get(new Integer(info.gateway));
Object obj = mtGateway.get(new Integer(gateway));
if (obj == null)
return Constants.GATE_WAY_COMMUNICATION_ERROR;
System.out.println("gateway:" + gateway);
MTSender sender = (MTSender) obj;
try {
mtList.put(info.MsgID, info);
sender.sendMt(info);
return 0;
} catch (IOException ex) {
logger.error(ex, ex);
mtList.remove(info.MsgID);
return Constants.GATE_WAY_COMMUNICATION_ERROR;
}
}
/**
* 得到已经注册的网关信息。
* */
public Collection gateWayInfo() {
Collection col = new Vector();
for (Iterator it = moGateway.values().iterator(); it.hasNext();) {
LongSockService service = (LongSockService) it.next();
col.add(service.getMoi());
}
for (Iterator it = mtGateway.values().iterator(); it.hasNext();) {
LongSockService service = (LongSockService) it.next();
col.add(service.getMoi());
}
return col;
}
/**
* 注册网关。
* */
public Object regGateway(int type, int gateway, LongSockService info) {
Integer key = new Integer(gateway);
if (type == GatewayType.MT)
return mtGateway.put(key, info);
else
return moGateway.put(key, info);
}
/**
* 注销网关。
* */
public Object unregGateway(int type, int gateway) {
Integer key = new Integer(gateway);
if (type == GatewayType.MT)
return mtGateway.remove(key);
else
return moGateway.remove(key);
}
public int restart() {
shutdown();
return startup();
}
//private Map mAllMtInfo;
/**
* 停止服务器。
* */
public int shutdown() {
//关闭服务器
for (Iterator it = servers.iterator(); it.hasNext();) {
ConcurrentServer server = (ConcurrentServer) it.next();
try {
server.close();
} catch (Throwable ex1) {
logger.error(ex1, ex1);
}
}
//关闭连接池。
ConnectionManager.getInstance().close();
//关闭线程池。
ThreadManager.getInstance().shutdownNow();
//清除已发送列表。
mtList.clear();
//singleton = null;
return 0;
}
/**
* 启动服务器。
* */
private int startup() {
//载入配置
try {
//启动注册的服务
Properties props = new Properties();
InputStream in = new FileInputStream(fileName);
props.load(in);
in.close();
//启动连接池
try {
String dbcpFileName = props.getProperty(CONFIG_PREFIX + "dbcpFileName");
ConnectionManager.getInstance().init(dbcpFileName);
} catch (SmsException ex) {
logger.fatal(ex, ex);
return -1;
}
//载入线程池
ThreadManager.getInstance().loadThreadPool(props);
servers = new Vector();
StringTokenizer stk = new StringTokenizer(props.getProperty("gcsms.server"), ",");
AbstractConcurrentServer server = null;
for (; stk.hasMoreTokens();) {
String svName = stk.nextToken();
String type = props.getProperty(CONFIG_PREFIX + svName + ".type");
int port = Integer.parseInt(props.getProperty(CONFIG_PREFIX + svName + ".port"));
if (type.equals("ConcurrentServer")) {
//启动服务
String className = props.getProperty(CONFIG_PREFIX + svName + ".service");
String executor = props.getProperty(CONFIG_PREFIX + svName + ".executor");
if ("APPReceiver".equals(svName))
//载入应用层服务
AppReceiver.loadServices(props);
server = loadService(port, svName, className, executor);
} else {
logger.warn("不能找到这种服务器类型" + type);
continue;
}
servers.add(server);
}
//启动日志服务
MyLogger.getInstance();
//启动配置的启动服务。
String starters = props.getProperty("com.gctech.sms.starter");
if (starters != null) {
stk = new StringTokenizer(starters, ",");
for (; stk.hasMoreTokens();) {
String className = props.getProperty("com.gctech.sms.starter." + stk.nextToken() + ".className");
Startable stb = (Startable) Class.forName(className).newInstance();
stb.start(props);
}
}
//启动测试线程
ReadMTPool mtpool = new ReadMTPool(2);
} catch (Exception ex1) {
logger.error(ex1, ex1);
return 1;
}
return 0;
}
private Server() {
moGateway = new HashMap();
mtGateway = new HashMap();
mtList = new HashMap();
/*int startup = startup();
if ( startup == 0 ){
}else{
System.exit(startup);
}*/
}
public void init(String fileName) {
this.fileName = fileName;
int startup = startup();
if (startup == 0) {
} else {
System.exit(startup);
}
}
private static Server singleton;
public static Server getInstance() {
if (singleton == null)
singleton = new Server();
return singleton;
}
ConcurrentServer loadService(int port, String serviceName, String serviceClass, String executor) throws InterruptedException {
Executor theExcecutor = null;
if (executor == null || executor.equals("ThreadedExecutor")) {
theExcecutor = new ThreadedExecutor();
} else {
theExcecutor = ThreadManager.getInstance().getExcecutor();
}
ConcurrentServer server = new ConcurrentServer(port, serviceName, serviceClass, theExcecutor);
Thread t = new Thread(server, serviceName);
t.start();
return server;
}
static final Logger logger = Logger.getLogger(Server.class);
public static void main(String[] args) {
StringTokenizer stk = new StringTokenizer("SPReciever,APPReceiver,MTSender,MOReceiver");
for (; stk.hasMoreTokens();) {
String svName = stk.nextToken();
// System.out.println(svName);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -