Exemplo n.º 1
0
        public async Task <ActionResult <IEnumerable <StockListItem> > > Get(
            [FromQuery] string search,
            [FromQuery] int?page,
            [FromQuery] int?itemsPerPage)
        {
            if (((page == null ? 1 : 0) ^ (itemsPerPage == null ? 1 : 0)) != 0)
            {
                // page 或 itemsPerPage 没有同时提供
                return(BadRequest());
            }

            var hbaseClient            = _hbaseClientFactory.Create();
            var scannerCreationOptions = new HBaseScannerCreationOptions
            {
                Batch       = 1000,
                MaxVersions = 1
            };

            // 获取所有的股票信息的列表
            IEnumerable <StockListItem> stocksList = Array.Empty <StockListItem>();

            using (var scanner = await hbaseClient.OpenScanner(RealtimeDataTableName, scannerCreationOptions))
            {
                while (await scanner.ReadNextBatch())
                {
                    stocksList = stocksList.Concat(scanner.CurrentBatch.Select(StockListItem.FromHBaseRow));
                }
            }

            // 在线程池线程中完成搜索和分页任务
            stocksList = await Task.Run(() =>
            {
                if (!string.IsNullOrEmpty(search))
                {
                    // 执行搜索
                    stocksList = stocksList.Where(
                        stock => stock.Code.IndexOf(search, StringComparison.CurrentCultureIgnoreCase) != -1 ||
                        stock.Name.IndexOf(search, StringComparison.CurrentCultureIgnoreCase) != -1);
                }

                if (page != null && itemsPerPage != null)
                {
                    stocksList = stocksList.Skip(page.Value *itemsPerPage.Value).Take(itemsPerPage.Value);
                }

                return(stocksList);
            });

            return(new ActionResult <IEnumerable <StockListItem> >(stocksList));
        }
Exemplo n.º 2
0
        /// <inheritdoc />
        public async Task <IHBaseScanner> OpenScanner(string tableName, HBaseScannerCreationOptions options = null)
        {
            if (tableName == null)
            {
                throw new ArgumentNullException(nameof(tableName));
            }

            // 构造请求负载
            var contentJson = string.Empty;

            if (options != null)
            {
                contentJson = HBaseSerializationHelper.SerializeObject(options);
            }

            // 发送 HTTP 请求
            var url     = $"{tableName}/scanner";
            var content = HttpRequestContentFactory.CreateJsonContent(contentJson);

            HttpResponseMessage response;

            using (var httpClient = CreateHttpClient())
            {
                response = await httpClient.PutAsync(url, content);
            }

            if (!response.IsSuccessStatusCode)
            {
                throw new HBaseException("HBase REST API 返回了表示错误的 HTTP 状态码:" + response.StatusCode);
            }

            // 从响应的 Location 头部拿到 Scanner 的接入点
            if (!response.Headers.TryGetValues("Location", out var scannerEndpoints))
            {
                throw new HBaseException("HBase REST API 没有返回任何有效的 Scanner 终结点。");
            }

            var scannerEpt = scannerEndpoints.FirstOrDefault();

            if (scannerEpt == null)
            {
                throw new HBaseException("HBase REST API 没有返回任何有效的 Scanner 终结点。");
            }

            return(new DefaultHBaseScanner(scannerEpt, _httpClientFactory));
        }