如何在Spring Kafka中从KSQL接收流式响应?

时间:2019-01-19 13:51:57

标签: java apache-kafka ksql

如何在Java Spring Boot应用程序中从kafka KSQL服务器接收分块响应?

当我对/query端点进行休息呼叫时,我仅得到1行,并且连接关闭。如何保持连接打开并接收多行?

医生说

  

响应将被流回,直到在   语句到达,或客户端关闭连接。

用Java实现此目的的方法是什么?即使对于KTable,我也只能获得1行。

https://docs.confluent.io/current/ksql/docs/developer-guide/api.html#run-a-query-and-stream-back-the-output

1 个答案:

答案 0 :(得分:1)

我能够解决的方法如下:

  • 将响应作为字符串获取
  • 逐行分析JSON对象(KafkaQueryResponse是代表1行的对象)

        ResponseEntity<String> result = template.exchange("/query",
            HttpMethod.POST,
            new HttpEntity<>(params, headers),
            String.class);
    
        List<KafkaQueryResponse> array = new ArrayList<>();
        JsonFactory jsonFactory = new JsonFactory();
        try(BufferedReader br = new BufferedReader(new StringReader(result.getBody()))) {
            Iterator<KafkaQueryResponse> value = objectMapper.readValues(jsonFactory.createParser(br), KafkaQueryResponse.class);
            value.forEachRemaining(e -> {
                if (e.getRow() != null) {
                    array.add(e);
                }
            });
        }
        array <----  this is the list of JSON objects
    

KafkaQueryResponse

    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class KafkaQueryResponse {
        private KafkaQueryRow row;
        private String finalMessage;
        private String errorMessage;

        @Data
        @JsonIgnoreProperties(ignoreUnknown = true)
        public static class KafkaQueryRow {
            private List<Object> columns;
        }
    }

此解决方案不允许分块读取流式响应。它等待整个响应到达客户端,然后关闭连接,然后解析所有json对象。