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)); }
/// <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)); }