⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spserver.java

📁 采用JAVA开发
💻 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 + -