예제 #1
0
        /// <summary>
        /// 下载
        /// </summary>
        /// <param name="getRecordsParam"></param>
        /// <returns></returns>
        public GetRecordsResult GetRecords(GetRecordsRequest getRecordsParam)
        {
            ObsWebServiceRequest obsWebServiceRequest = new DISWebServiceRequest();
            IRequest             requestobs           = new DISDefaultRequest(obsWebServiceRequest, Constants.SERVICENAME)
            {
                HttpMethod = HttpMethodName.GET.ToString()
            };

            string resourcePath = ResourcePathBuilder.Standard()
                                  .WithProjectId(_disConfig.GetProjectId())
                                  .WithResource(new RecordResource(null))
                                  .Build();

            requestobs.ResourcePath = resourcePath;
            GetRecordsResult result = null;

            result = Request <GetRecordsResult>(getRecordsParam, requestobs);

            result = DecorateRecords(result);
            return(result);
        }
예제 #2
0
        protected GetRecordsResult DecorateRecords(GetRecordsResult result)
        {
            //解压
            if (_disConfig.IsDataCompressEnabled())
            {
                if (result.Records != null)
                {
                    for (int i = 0; i < result.Records.Count; i++)
                    {
                        byte[] input = result.Records[i].Data;
                        try
                        {
                            byte[] uncompressedInput = CompressUtils.Decompress(input);
                            result.Records[i].Data = uncompressedInput;
                        }
                        catch (IOException e)
                        {
                            logger.Error(e.Message, e);
                            throw new Exception(e.Message);
                        }
                    }
                }
            }

            //解密
            if (IsEncrypt())
            {
                List <Record> records = result.Records;
                if (records != null)
                {
                    foreach (var record in records)
                    {
                        record.Data = Decrypt(record.Data);
                    }
                }
            }

            return(result);
        }
        /// <summary>
        /// 下载数据
        /// </summary>
        /// <param name="streamName">通道名称</param>
        /// <param name="shardId">分区ID</param>
        public static void RunConsumerDemo(string streamName, string shardId)
        {
            var dic = new DISIngestionClient();

            //该参数与游标类型AT_TIMESTAMP搭配使用
            long timestamp = 1543397197333;

            //该参数与游标类型AT_SEQUENCE_NUMBER、AFTER_SEQUENCE_NUMBER搭配使用
            const string startingSequenceNumber = "0";

            //AT_SEQUENCE_NUMBER:从特定序列号所在的记录开始读取。此类型为默认游标类型。
            //AFTER_SEQUENCE_NUMBER:从特定序列号后的记录开始读取。
            //TRIM_HORIZON:从分区中时间最长的记录开始读取。
            //LATEST:在分区中最新的记录之后开始读取,以确保始终读取分区中的最新数据。
            //AT_TIMESTAMP:从特定时间戳开始读取。
            const string shardIteratorType = "AT_SEQUENCE_NUMBER";

            var request = new GetShardIteratorRequest
            {
                //通道名称
                StreamName = streamName,
                //分区值
                ShardId = shardId,
                //序列号,可选参数
                StartingSequenceNumber = startingSequenceNumber,
                //游标类型,可选参数
                ShardIteratorType = shardIteratorType,
                //时间戳,可选参数
                Timestamp = timestamp
            };

            var recordsRequest = new GetRecordsRequest();
            var response       = dic.GetShardIterator(request);

            Console.Out.WriteLine(response);

            var iterator = response.ShardIterator;

            //下载数据,这里的进程不会退出,只要检测到有数据就下载数据
            while (true)
            {
                //数据游标。
                recordsRequest.ShardIterator = iterator;
                GetRecordsResult recordResponse = dic.GetRecords(recordsRequest);
                // 下一批数据游标
                iterator = recordResponse.NextShardIterator;

                if (recordResponse.Records.Count > 0)
                {
                    foreach (var record in recordResponse.Records)
                    {
                        Console.WriteLine("Record[{0}] = {1}", record.SequenceNumber, DecodeData(record.Data));
                    }
                    Thread.Sleep(1000);
                }
                else
                {
                    Thread.Sleep(1000);
                }
            }
        }