我一直在浏览hazelcast-jet文档,以查找对源的引用,这些源是由某些外部过程异步馈送的-在我的情况下,这将是http帖子。
我确实查看了Kafka code,因为这似乎是最接近的,但无法弄清楚新到达的事件将如何触发任何事件。我认为这里不会涉及阻塞线程。
对于能更好地理解在“流”元素被滴入的环境中如何使用榛子喷射的任何指针,我将不胜感激。
答案 0 :(得分:1)
即将推出的Hazelcast Jet 0.7版本引入了Source Builder对象,这使构建自定义源变得更加简单。您可以使用它编写类似于以下内容的代码:
public static void main(String[] args) {
Pipeline pipeline = Pipeline.create();
StreamSource<String> source = SourceBuilder
.timestampedStream("http-trickle", x -> new HttpSource())
.fillBufferFn(HttpSource::addToBuffer)
.destroyFn(HttpSource::destroy)
.build();
StreamStage<String> srcStage = pipeline.drawFrom(source);
}
private static class HttpSource {
private final BlockingQueue<String> queue = new LinkedBlockingQueue<>(10000);
private final ArrayList<String> buffer = new ArrayList<>();
private final AsyncClient<String> client =
new AsyncClient<String>().addReceiveListener(queue::add);
void addToBuffer(TimestampedSourceBuffer<String> sourceBuffer) {
queue.drainTo(buffer);
for (String line : buffer) {
sourceBuffer.add(line, extractTimestamp(line));
}
buffer.clear();
}
void destroy() {
client.close();
}
}
在这里,我使用了一个模拟AsyncClient
,该模拟应该代表您实际的异步HTTP客户端。它希望您提供一个回调,该回调将在到达时处理传入的数据。 Jet的源构建器要求您提供另一个回调fillBufferFn
,该回调将数据发送到处理管道。
您对AsyncClient
的回调应将数据推送到并发队列,而您的fillBufferFn
应将队列消耗到Jet的源缓冲区。
您可能会想简化我为此提供的代码:
void addToBufferDirect(TimestampedSourceBuffer<String> sourceBuffer) {
for (String line; (line = queue.poll()) != null;) {
sourceBuffer.add(line, extractTimestamp(line));
}
}
这避免了中间缓冲区位于并发队列和Jet的源缓冲区之间。实际上,它在大多数时候都可以使用,但是如果您遇到了高峰流量,addToBufferDirect
可能永远不会完成。这将违反与Jet的合同,这要求您在一秒钟左右的时间内从fillBufferFn
返回。
我们已经认识到这种将源构建器与异步客户端API结合使用的模式非常普遍,我们计划为处理它提供更多便利。