2024年Clojure状况调查中分享您的想法!

欢迎!请查看关于页面以了解更多关于该服务的详细信息。

0
IO

我正在尝试读取一个json HTTP流并无限期地使用json元素。

我写出了下面的代码,但它会关闭流并且只返回30个结果 - 我该如何无限期地使用HTTP流呢?

谢谢你的帮助!

(ns core
  (:require [clj-http.client :as http]
            [cheshire.core :as json]
            [clojure.java.io :as io]
            [clojure.core.async :as async]))

(def gh-url "https://api.github.com/events")
(def chan (async/chan 100))

(async/go
  (loop [r (async/<! chan)]
    (when (not-empty r) (println (:type r)))
    (recur (async/<! chan))))

(defn read-gh-stream [url]
  (with-open [stream (-> url (http/get {:as :stream}) :body)]
    (let [lines (-> stream io/reader (json/parse-stream true))]
      (doseq [l lines]
        (async/go
          (async/>! chan l))))))

1 答案

+1
by

GitHub API将只在每次http调用中返回30个事件,它不会像事件发生一样持续向您发送事件。如果您想要下一个30个事件,您需要向GitHub API发出另一个请求。请参阅以下文档: https://developer.github.com/v3/activity/events/

by
谢谢你的回复!我会尝试使用Twitter持久的http流。

我撰写的代码可以正确吗?或者`do-seq`会关闭流吗?

PS:我还在尝试通过将日志文件流式传输到`core.async`来消费它,但文件连接总是在某个时刻关闭。
`with-open`将在(doseq)体结束后关闭流。每次都需要重新运行`read-gh-stream`。
如果`lines`是懒惰的,我预计`doseq`会继续处理流,尽管`parse-stream`的文档说:

如果顶层对象是一个数组,它将进行懒惰解析
谢谢,我明白了。

我在读取一个(不断更新的)日志文件的同时向通道发送每一行存在困难。似乎找不到一个展示如何做到这一点的示例。
...