我们正在尝试在Groovy中读取流式JSON数据(使用JsonSlurper),但我们只能通过重复解析源URL来实现。我们想要做的是它是一个推送机制,以便任何时候有新的内容我们得到一个回调。那可能吗? (如果你有一个Java解决方案,那也没关系)
package json
import groovy.json.JsonParserType
import groovy.json.JsonSlurper
class JsonParser {
private static final String JSON_URL = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20csv%20where%20url%3D'http%3A%2F%2Fdownload.finance.yahoo.com%2Fd%2Fquotes.csv%3Fs%3DHM-B.ST%26f%3Dsl1d1t1c1ohgv%26e%3D.csv'%20and%20columns%3D'symbol%2Cprice%2Cdate%2Ctime%2Cchange%2Ccol1%2Chigh%2Clow%2Ccol2'&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"
static main(args) {
def url = new URL(JSON_URL)
def urlStream = null
try {
urlStream = url.openStream()
def jsonSlurper = new JsonSlurper().setType(JsonParserType.INDEX_OVERLAY)
def jsonObj = jsonSlurper.parse(url)
10.times {
println jsonObj.query.created.toString()
//println jsonObj.toString()
jsonObj = jsonSlurper.parse(url)
sleep(1000)
}
} finally {
if (urlStream != null) urlStream.close()
}
}
}
答案 0 :(得分:1)
为了使用推送通知(又名observer pattern),需要做一些通知。由于URL不通知,您必须继续进行轮询。
除了线程考虑之外,这里有一种使用回调进行轮询的简单方法。
import groovy.json.JsonParserType
import groovy.json.JsonSlurper
final String JSON_URL = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20csv%20where%20url%3D'http%3A%2F%2Fdownload.finance.yahoo.com%2Fd%2Fquotes.csv%3Fs%3DHM-B.ST%26f%3Dsl1d1t1c1ohgv%26e%3D.csv'%20and%20columns%3D'symbol%2Cprice%2Cdate%2Ctime%2Cchange%2Ccol1%2Chigh%2Clow%2Ccol2'&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"
poll(JSON_URL.toURL(), 5, 1000) { json ->
println json
}
def poll(URL url, int iterations, int interval, Closure callback) {
def jsonSlurper = new JsonSlurper().setType(JsonParserType.INDEX_OVERLAY)
def lastTimestamp = null
iterations.times {
def json = jsonSlurper.parse(url)
def timestamp = json.query.results.row.time
if(timestamp != lastTimestamp) callback(json)
lastTimestamp = timestamp
sleep(interval)
}
}
回调是一个闭包。
BONUS:只有在数据的时间戳发生变化时才会调用回调。