📄 spserver.java
字号:
package com.gctech.sms.sp;
import java.util.List;
import java.util.Vector;
import java.util.Map;
import java.util.HashMap;
import com.gctech.sms.sp.msg.SubscribeReq;
import com.gctech.sms.sp.msg.SubscribeResp;
import com.gctech.sms.sp.msg.MsgHead;
import org.apache.commons.lang.math.RandomUtils;
import com.gctech.util.Tools;
import com.gctech.util.SynMemIDGenerator;
import com.gctech.util.IDGenerator;
import java.io.*;
import org.apache.log4j.Logger;
import com.gctech.sms.sp.msg.UnsubscribeReq;
import com.gctech.sms.sp.msg.UnsubscribeResp;
import EDU.oswego.cs.dl.util.concurrent.Sync;
import EDU.oswego.cs.dl.util.concurrent.Mutex;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: gctech</p>
* @author 翁俊岭
* @version $Id: SpServer.java,v 1.5 2004/07/09 08:06:38 wengjl Exp $
*/
public class SpServer {
private static SpServer singleton;
static final int MAX_HASH_MAP = 1000;
static final long TIME_OUT = 10000L;
IDGenerator idGen = null;
//SP没有连接
static final int SP_NOT_CONNECTED = 1000;
//SP通讯错误
static final int SP_COMMU_ERROR = 1002;
//SP超时
static final int SP_TIME_OUT = 1003;
public static SpServer getInstance(){
if ( singleton == null )
singleton = new SpServer();
return singleton;
}
public void send(String spId, byte[] data){
//发送用户上行数据
Object obj = services.get(spId);
if ( obj != null ){
List allService = (List)obj;
SpSmsService service = null;
try {
System.out.println("allService.size()= " + allService.size());
service = (SpSmsService) allService.get(RandomUtils.
nextInt(allService.size()));
service.send(data);
System.out.println("Send out success!");
}
catch (Exception ex1) {
ex1.printStackTrace();
}
}else{
System.out.println("spId:"+spId+" can't found!");
}
}
/**
* 订阅通知。
* */
public SubscribeResp subscribe(SubscribeReq req){
int rt = -100;
Object obj = this.services.get(req.getSpId());
//没有SP连接
if ( obj == null ){
rt = SP_NOT_CONNECTED;
}else{
//找到一个随机的连接
List spServices = (List) obj;
int size = spServices.size();
if (size <= 0)
rt = SP_NOT_CONNECTED;
else {
SpSmsService service = (SpSmsService) spServices.get(RandomUtils.
nextInt(spServices.size()));
byte[] subReq = new byte[138];
Tools.int2byte(138, subReq, 0);
Tools.int2byte(Constants.SUBSCRIBE_REQ, subReq, 4);
int seq = idGen.nextInt();
Tools.int2byte(seq, subReq, 12);
byte[] msgId = req.getMsgId().getBytes();
System.arraycopy(msgId, 0, subReq, 16, msgId.length);
byte[] submitId = req.getSubmitId().getBytes();
System.arraycopy(submitId, 0, subReq, 36, submitId.length);
byte[] feeMobile = req.getFeeMobile().getBytes();
System.arraycopy(feeMobile, 0, subReq, 56, feeMobile.length);
byte[] serviceId = req.getServiceId().getBytes();
System.arraycopy(serviceId, 0, subReq, 77, serviceId.length);
if (req.getSubServiceId() != null) {
byte[] subService = req.getSubServiceId().getBytes();
System.arraycopy(subService, 0, subReq, 97, subService.length);
}
byte[] destMobile = req.getDestMobile().getBytes();
System.arraycopy(destMobile, 0, subReq, 117, destMobile.length);
logger.info("[请求类型:"+Constants.SUBMIT_REQ+
",消息ID:"+seq+
",消息长度:"+138+
",请求流水号:"+req.getMsgId()+
",订阅流水号:"+req.getSubmitId()+
",支付卡号:"+req.getFeeMobile()+
",订阅服务号:"+req.getServiceId()+
",接收手机号:"+req.getDestMobile());
try {
//把请求对象放入hashtable
//上锁
Sync lock = new Mutex();
lock.acquire();
allSubResp.put(req.getMsgId(), lock);
//发送请求
service.send(subReq);
logger.debug(new String(subReq));
logger.debug("send subscribe msg to sp ok!");
//等候通知。
logger.debug("waiting for response!");
boolean ret = lock.attempt(TIME_OUT);
if ( ret ){
Object o = allSubResp.remove(req.getMsgId());
if (o != null && o instanceof SubscribeResp) {
return (SubscribeResp) o;
}
}else{
rt = SP_TIME_OUT;
}
}catch (IOException ex) {
//SP通讯错误
logger.error(ex, ex);
allSubResp.remove(req.getMsgId());
rt = SP_COMMU_ERROR;
}catch (InterruptedException ex1) {
logger.error(ex1, ex1);
}
}
}
SubscribeResp resp = new SubscribeResp();
MsgHead head = new MsgHead();
head.setCommandStatus(rt);
resp.setMsgHead(head);
return resp;
}
void removeSubResp(String msgId){
allSubResp.remove(msgId);
}
void removeUnsubResp(String msgId){
allUnsubResp.remove(msgId);
}
Object putSubscribeResp(String msgId, SubscribeResp resp){
if ( allSubResp.size() > MAX_HASH_MAP )
allSubResp.clear();
return allSubResp.put(msgId, resp);
}
Object putUnsubscribeResp(String msgId, UnsubscribeResp resp){
if ( allUnsubResp.size() > MAX_HASH_MAP )
allUnsubResp.clear();
return allUnsubResp.put(msgId, resp);
}
/**
* 取消订阅通知。
* */
public UnsubscribeResp unsubscribe(UnsubscribeReq req){
int rt = -100;
Object obj = this.services.get(req.getSpId());
//没有SP连接
if ( obj == null ){
rt = SP_NOT_CONNECTED;
}else{
//找到一个随机的连接
List spServices = (List)obj;
int size = spServices.size();
if ( size <= 0 )
rt = SP_NOT_CONNECTED;
else{
SpSmsService service = (SpSmsService) spServices.get(RandomUtils.
nextInt(size));
byte[] subReq = new byte[56];
Tools.int2byte(56, subReq, 0);
Tools.int2byte(Constants.UNSUBSCRIBE_REQ, subReq, 4);
int seq = idGen.nextInt();
Tools.int2byte(seq, subReq, 12);
byte[] msgId = req.getMsgId().getBytes();
System.arraycopy(msgId, 0, subReq, 16, msgId.length);
byte[] submitId = req.getSubmitId().getBytes();
System.arraycopy(submitId, 0, subReq, 36, submitId.length);
try {
//把请求对象放入hashtable
//上锁
Sync lock = new Mutex();
lock.acquire();
allUnsubResp.put(req.getMsgId(), lock);
//发送请求
//发送请求
service.send(subReq);
logger.info("[请求类型:"+Constants.UNSUBSCRIBE_REQ+
",消息ID:"+seq+
",消息长度:"+138+
",请求流水号:"+req.getMsgId()+
",订阅流水号:"+req.getSubmitId());
//等候通知。
boolean ret = lock.attempt(TIME_OUT);
if ( ret ){
Object o = this.allUnsubResp.remove(req.getMsgId());
if (o != null && o instanceof UnsubscribeResp) {
return (UnsubscribeResp) o;
}
}else{
rt = SP_TIME_OUT;
}
}catch (IOException ex) {
//SP通讯错误
logger.error(ex, ex);
allUnsubResp.remove(req.getMsgId());
rt = SP_COMMU_ERROR;
}catch (InterruptedException ex1) {
logger.error(ex1, ex1);
}
}
}
UnsubscribeResp resp = new UnsubscribeResp();
MsgHead head = new MsgHead();
head.setCommandStatus(rt);
resp.setMsgHead(head);
return resp;
}
//所有的订阅回复
private Map allSubResp;
//
private Map allUnsubResp;
//所有SP连接的服务
private Map services;
private SpServer() {
services = new HashMap();
allSubResp = new HashMap();
allUnsubResp = new HashMap();
this.idGen = new SynMemIDGenerator();
}
public boolean register(SpSmsService service){
Object obj = services.get(service.getSpId());
List spServices = null;
if ( obj == null ){
spServices = new Vector();
services.put(service.getSpId(), spServices);
}else{
spServices = (List)obj;
}
return spServices.add(service);
}
public boolean unregister(SpSmsService service){
Object obj = services.get(service.getSpId());
if ( obj == null )
return false;
List spServices = (List)obj;
return spServices.remove(service);
}
public static void main(String[] args) {
int n = 10;
for ( int i = 0; i < 10; i++ ){
n <<= 1;
System.out.println(n);
}
}
static final Logger logger = Logger.getLogger(SpServer.class);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -