DataCollectServerImpl

vpublic class DataCollectServerImpl extends Thread implements DataCollectServer
{
    /**
     * 日志对象
     */
    private static Logger logger = Logger.getLogger(DataCollectServerImpl.class);
    
    /**
     * 1秒钟=1000毫秒
     */
    private static final int ONESECOND = 1000;
    
    /**
     * 接收消息的数据流buff长度
     * 与客户端发送消息的数据流buff长度一致。
     */
    private int receiveDataLen = PortalCommonConst.DATA_LEN_2048;
    
    /**
     * 发送消息的数据流buff长度
     */
    private int sendDataLen = PortalCommonConst.DATA_LEN_256;
    
    /**
     * 接收消息的数据流buff
     */
    private byte[] recBuff = new byte[receiveDataLen];
    
    /**
     * 接收数据的消息包
     */
    private DatagramPacket recPacket = new DatagramPacket(recBuff, receiveDataLen);
    
    /**
     * 发送消息的数据流buff
     */
    private byte[] sendBuff = new byte[sendDataLen];
    
    /**
     * 发送数据的消息包
     */
    private DatagramPacket sendPacket = new DatagramPacket(sendBuff, sendDataLen);
    
    /**
     * 接收发送消息的Socket
     */
    private DatagramSocket datagramRecSocket = null;
    
    /**
     * 话筒数据汇聚处理对象
     */
    private PerformanceServiceProc performanceServiceProc = null;
    
    /**
     * 系统话筒数据汇聚处理对象
     */
    private SystemPerformanceServiceProc systemPerformanceServiceProc = null;
    
    /**
     * 告警数据汇聚处理对象
     */
    private AlarmCheck alarmCheck = new AlarmCheck();
    
    /**
     * 连接告警数据汇聚处理对象
     */
    private GatherConnectAlarm  gatherConnectAlarm = new GatherConnectAlarm();
    
    /**
     * 连接码流数据汇聚处理对象
     */
    private TraceServ traceServ = new TraceServImpl();
    
    /**
     *数据库告警数据汇聚处理对象
     */
    private GatherDBAlarm gatherDBAlarm = new GatherDBAlarm();
    
    /**
     * 缓存告警数据汇聚处理对象
     */
    private GatherCacheAlarm gatherCacheAlarm = new GatherCacheAlarm();
    
    private void init()
    {
        logger.recordEnterMethodLog();
        receiveDataLen = SystemConfig.getDataCollectSendAndRecDataLen();
        recBuff = new byte[receiveDataLen];
        recPacket = new DatagramPacket(recBuff, receiveDataLen);
        logger.recordExitMethodLog();
    }
    /**
     * 
     *  线程入口函数
     */
    @Override
    public void run()
    {
        recieveMessage();
    }
    
    /**
     * 
     * 接收数据汇聚的处理函数。
     *
     */
    


    
    @SuppressWarnings("finally")
    public void recieveMessage()
    {
        logger.recordEnterMethodLog();
        
        DataCollect dataCollect = null;
        int msgID = 0;
        Object object = null;
        int result = 0;
        byte[] byteMsg = null;
        
        if (null == performanceServiceProc)
        {
            performanceServiceProc = (PerformanceServiceProc)ContextRegistry.
                getContextHolder().getBean("performanceServiceProc");
        }
        
        if (null == systemPerformanceServiceProc)
        {
            systemPerformanceServiceProc = (SystemPerformanceServiceProc)ContextRegistry.
                getContextHolder().getBean("systemPerformanceServiceProc");
        }
        
        boolean bCreatSocketSuccess = false;
        
        while (!bCreatSocketSuccess)
        {
            try
            {
                InetSocketAddress socketAddress = new InetSocketAddress(
                        SystemConfig.getDataCollectServerIp(), SystemConfig.getDataCollectServerPort());
                datagramRecSocket = new DatagramSocket(socketAddress);
                if (null != datagramRecSocket)
                {
                    bCreatSocketSuccess = true;  
                    break;
                }
            }
            catch (SocketException sockete)
            {
                // 话筒服务端监听端口创建失败,等待系统刷新时间后重新创建
                logger.recordErrorsLog("\n" 
                        + "***************************************************************************" + "\n"
                        + "*                                                                         *" + "\n"
                        + "     Current ip is " + SystemConfig.getDataCollectServerIp() + ", port is "  
                        +       SystemConfig.getDataCollectServerPort() + "\n"
                        + "*    Creat socket fail, please config server Ip and port in BD!           *" + "\n"
                        + "*                                                                         *" + "\n"
                        + "***************************************************************************" + "\n");
            }
            
            try
            {
                Thread.sleep(SystemConfig.getRefushTime() * ONESECOND);
            }
            catch (InterruptedException e)
            {
                logger.recordErrorsLog("sleep fail");
                continue;
            }
        }
        
        logger.recordInfoLog("\n" 
                + "***************************************************************************" + "\n"
                + "*                                                                         *" + "\n"
                + "     Current ip is " + SystemConfig.getDataCollectServerIp() + ", port is " 
                + SystemConfig.getDataCollectServerPort() + "\n"
                + "*    Creat socket Success!                                                *" + "\n"
                + "*                                                                         *" + "\n"
                + "***************************************************************************" + "\n");
        
        // 此处用两个while的作用是,把try-catch放到里面的while外面,
        // 减少系统消耗,提高效率,又能达到异常捕获的效果
        while (true)
        {
            try
            {
                while (true)
                {
                    // 如果接收消息的内存大小改变,需要重新申请和分配内存
                    if (SystemConfig.getDataCollectSendAndRecDataLen() != receiveDataLen)
                    {
                        init();
                    }
                    
                    datagramRecSocket.receive(recPacket);
                    
                    //结果返回值刷新
                    result = PortalCommonConst.RESULT_SUCCESS;
                    
                    // 对收到的消息进行解包,解包不成功,消息丢弃,等待下一个消息
                    byteMsg = recPacket.getData();
                    if (null != byteMsg)
                    {
                        if (null == dataCollect)
                        {
                            dataCollect = new DataCollect();
                        }
                        
                        result = dataCollect.revertPacket(byteMsg);
                        if (PortalCommonConst.RESULT_SUCCESS == result)
                        {
                            msgID = dataCollect.getMsgID();
                            logger.recordDebugLog("recevice msgID is " + msgID);
                            // 消息接收到后给对方响应
                            sendAck(new DataCollect(msgID, PortalCommonConst.RESULT_SUCCESS));  
                            object = dataCollect.getObject(); 
                        }
                        else 
                        {
                            logger.recordErrorsLog("dataCollect error");
                            continue;
                        }
                    }
                    else
                    {
                        logger.recordErrorsLog("byteMess is null");
                        continue;
                    }
                    
                    // 处理消息
                    result = procRecMsg(msgID, object);
                    if (result != ErrorCodeDecode.SUCCESS)
                    {
                        logger.recordErrorsLog("ProcRecMsg method is fail. msgID=" + msgID);
                    }
                }
            }
            catch (Exception e)
            {
                logger.recordErrorsLog(e.getMessage());
            }
            finally
            {
                continue;
            }
        }
    }
    
    /**
     * 
     * 回复响应消息
     * 
     * @param dataCollect 数据汇聚对象
     */
    private void sendAck(DataCollect dataCollect)
    {
        logger.recordEnterMethodLog();
        
        if (null == dataCollect)
        {
            logger.recordErrorsLog("dataCollect is null");
            return;
        }
        
        // 填充发送的目标地址和发送的数据
        sendPacket.setAddress(recPacket.getAddress());
        sendPacket.setPort(recPacket.getPort());
        sendPacket.setData(dataCollect.addPacket());
        
        try
        {
            datagramRecSocket.send(sendPacket);
        }
        catch (IOException e)
        {
            logger.recordErrorsLog("send msg fail");
        }
        
        logger.recordExitMethodLog();
    }
    
    /**
     * 
     * 根据数据类型进行数据汇聚
     * 
     * @param msgID 消息ID
     * @param object 接收到的消息对象
     * @return result : 0成功   非0失败
     */
    private int procRecMsg(int msgID, Object object)
    {
        logger.recordEnterMethodLog();
        
        int result = ErrorCodeDecode.SUCCESS;
        
        //依据消息ID调用对应的数据汇聚处理函数,进行不同的业务处理
        switch (msgID)
        {
            // 业务性能统计消息
            case PortalCommonConst.PERFORMANCE_MSG_ID:
            {                        
                result = performanceServiceProc.procPerformance(object);
                if (ErrorCodeDecode.SUCCESS != result)
                {
                    logger.recordErrorsLog("procPerformance fail");
                }
                break;
            }


            //系统性能统计信息
            case PortalCommonConst.SYSTEM_PERFORMANCE_MSG_ID :
            {
                result = systemPerformanceServiceProc.procSystemPerformance(object);
                if (ErrorCodeDecode.SUCCESS != result)
                {
                    logger.recordErrorsLog("procSystemPerformance fail");
                }
                break;
            }
            
            // 告警心跳消息
            case PortalCommonConst.ALARM_HEARTBEAT_MSG_ID :
            {
                sendAck(new DataCollect(PortalCommonConst.ALARM_HEARTBEAT_MSG_ID , PortalCommonConst.RESULT_SUCCESS));
                result = alarmCheck.check(object);
                if (ErrorCodeDecode.SUCCESS != result)
                {
                    logger.recordErrorsLog("Alarm heartbeat send  fail");
                }
                
                break;
            }
            
            //连接异常告警
            case PortalCommonConst.ALARM_CONNECT_MSG_ID :
            {
                sendAck(new DataCollect(PortalCommonConst.ALARM_CONNECT_MSG_ID , PortalCommonConst.RESULT_SUCCESS));
                result = gatherConnectAlarm.check(object);
                if (ErrorCodeDecode.SUCCESS != result)
                {
                    logger.recordErrorsLog("Alarm connect send  fail");
                }
                
                break;
            }
            
            //数据库异常告警
            case PortalCommonConst.ALARM_DB_MSG_ID :
            {
                sendAck(new DataCollect(PortalCommonConst.ALARM_DB_MSG_ID , PortalCommonConst.RESULT_SUCCESS));
                result = gatherDBAlarm.check(object);
                if (ErrorCodeDecode.SUCCESS != result)
                {
                    logger.recordErrorsLog("Alarm DB send  fail");
                }
                
                break;
            }
            
            //缓存异常告警
            case PortalCommonConst.ALARM_CACHE_MSG_ID :
            {
                sendAck(new DataCollect(PortalCommonConst.ALARM_CACHE_MSG_ID , PortalCommonConst.RESULT_SUCCESS));
                result = gatherCacheAlarm.check(object);
                if (ErrorCodeDecode.SUCCESS != result)
                {
                    logger.recordErrorsLog("Alarm cache send  fail");
                }
                
                break;
            }
            
            //码流异常告警
            case PortalCommonConst.TRACE_COLLECTION_MSG_ID :
            {
                sendAck(new DataCollect(PortalCommonConst.TRACE_COLLECTION_MSG_ID , PortalCommonConst.RESULT_SUCCESS));
                result = traceServ.decode(object);
                if (ErrorCodeDecode.SUCCESS != result)
                {
                    logger.recordErrorsLog("Trace send  fail");
                }
                
                break;
            }
            
            default:
            {
                logger.recordErrorsLog("unknown msgID is " + msgID);
                break;
            }
        }
        
        logger.recordExitMethodLog();
        
        return result;
    }
    
}
期货全品种行情下载工具和行情重播回测API 期货市场全品种行情tick数据收集工具3.1 支持盘中实时行情和历史行情连续回播,开盘时间申请到当前行情时间段也不会缺行情, 当数据服务器将文件历史行情回播完成后,开始接着播放实时行情,直到通过python api 调用方法,通知服务器停止回播实时行情。 目前不支持并发,对同一个品种多次调用回播api,会导致回播行情数据顺序错乱。 对不同品种多次调用回播api,可能因为cpu占用过大,会导致服务器UI没有响应。后面升级版本会 完整的并发解决方案。 期货市场全品种行情tick数据收集工具3.0 (1)TCP网络连接由同步模式改为异步模式,解决某些网络状况无法连接数据采集服务器的问题 未来升级版本将优化性能 期货市场全品种行情tick数据收集工具2.9b 清理了不需要的.lib,不会再提示缺少ctp的dll文件,删除了不需要的方法 支持任意IP地址的连接,可以实现连接云主机运行的行情收集服务器,或局域网里的行情收集服务器。 期货市场全品种行情tick数据收集工具2.9 修复了多个API进程之间回调数据时互相影响 当前合约数约323个合约,最大范围1200个合约,视合约产品而定。 本例正式发布版本2.7 可以自由设置行情服务器 模拟simnow24小时行情服务器在交易日上午没有数据,要在下午4点之后才有数据。 模拟simnow实盘同步时间服务器,和实盘同步。 可改为期货公司的服务器IP,见“快期”软件设置“测试和代理”中的行情IP地址 双击合约文件列表可打开分时图 TestPythonApi可以调用DataCollectServer收集的行情数据(给定合约和时间段) 2017.3.11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值