You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:使用Java 8连接Kusto的可行实现方法

Java 8连接Kusto的可行方案

1. 使用兼容Java 8的旧版本Kusto Java SDK

官方Kusto Java SDK从后续版本开始要求Java 11+,但早期版本仍支持Java 8。你可以在项目中指定兼容的旧版本依赖,比如0.12.x系列(具体版本可通过maven仓库确认兼容性)。

依赖配置(Maven示例)

<dependency>
    <groupId>com.microsoft.azure.kusto</groupId>
    <artifactId>azure-kusto-data</artifactId>
    <version>0.12.0</version>
</dependency>

代码适配

旧版本的API和你当前使用的代码大致兼容,仅需确保依赖版本正确即可,你的现有代码:

ConnectionStringBuilder csb = ConnectionStringBuilder.createWithAadApplicationCredentials(clusterPath, appId, appKey, authorityId);
Client kustoClient = ClientFactory.createClient(csb);

在旧版本中可以正常运行。

2. 直接调用Kusto REST API

如果不想依赖SDK,可直接通过HTTP请求调用Kusto的REST接口,Java 8的原生HttpURLConnection或第三方库(如OkHttp,支持Java 8)都可以实现。

核心步骤

  • 通过AAD客户端凭据流获取访问令牌
  • 携带令牌调用Kusto查询/ ingestion接口

代码示例

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class KustoRestClient {
    private static final String TOKEN_ENDPOINT = "https://login.microsoftonline.com/%s/oauth2/token";
    private static final String KUSTO_QUERY_ENDPOINT = "%s/v1/rest/query";

    // 获取AAD访问令牌
    public static String getAadToken(String tenantId, String clientId, String clientSecret) throws Exception {
        String tokenUrl = String.format(TOKEN_ENDPOINT, tenantId);
        HttpURLConnection conn = (HttpURLConnection) new URL(tokenUrl).openConnection();
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);

        Map<String, String> params = new HashMap<>();
        params.put("grant_type", "client_credentials");
        params.put("client_id", clientId);
        params.put("client_secret", clientSecret);
        params.put("resource", "https://kusto.azure.com/");

        String postData = params.entrySet().stream()
                .map(e -> e.getKey() + "=" + e.getValue())
                .collect(Collectors.joining("&"));

        conn.getOutputStream().write(postData.getBytes());

        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        StringBuilder response = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            response.append(line);
        }
        reader.close();

        // 解析获取access_token,实际项目建议用Jackson/Gson等JSON库处理
        return response.toString().split("\"access_token\":\"")[1].split("\"")[0];
    }

    // 调用Kusto查询接口
    public static String executeQuery(String clusterUrl, String token, String database, String query) throws Exception {
        String queryUrl = String.format(KUSTO_QUERY_ENDPOINT, clusterUrl);
        HttpURLConnection conn = (HttpURLConnection) new URL(queryUrl).openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Authorization", "Bearer " + token);
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setDoOutput(true);

        String requestBody = String.format("{\"db\":\"%s\",\"csl\":\"%s\"}", database, query);
        conn.getOutputStream().write(requestBody.getBytes());

        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        StringBuilder response = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            response.append(line);
        }
        reader.close();

        return response.toString();
    }

    public static void main(String[] args) throws Exception {
        String clusterPath = "https://your-cluster.kusto.windows.net";
        String appId = "your-app-id";
        String appKey = "your-app-secret";
        String tenantId = "your-tenant-id";
        String database = "your-database";
        String query = "YourTable | take 10";

        String token = getAadToken(tenantId, appId, appKey);
        String queryResult = executeQuery(clusterPath, token, database, query);
        System.out.println(queryResult);
    }
}

3. 升级项目至Java 11(备选方案)

如果项目允许,升级到Java 11是最稳妥的选择——官方SDK的后续功能更新、bug修复都会基于Java 11+,能避免长期的兼容性问题。

内容的提问来源于stack exchange,提问作者superninja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:53:16