Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 风暴>;如何将Java回调集成到喷口中_Clojure_Streaming_Message Queue_Apache Storm - Fatal编程技术网

Clojure 风暴>;如何将Java回调集成到喷口中

Clojure 风暴>;如何将Java回调集成到喷口中,clojure,streaming,message-queue,apache-storm,Clojure,Streaming,Message Queue,Apache Storm,我正在尝试将Storm()集成到我的项目中。我摸索拓扑、喷口和螺栓的概念。但现在,我正试图找出一些事情的实际实现 A)我有一个使用Java和Clojure的多语言环境。我的Java代码是一个回调类,其方法触发流数据。推送到这些方法的事件数据,就是我想用作喷口的东西 因此,第一个问题是如何将进入这些方法的数据连接到喷口?我正在尝试I)传递backtype.storm.topology.IRichSpout,然后ii)传递backtype.storm.spoute.spoutoutoutputCol

我正在尝试将Storm()集成到我的项目中。我摸索拓扑、喷口和螺栓的概念。但现在,我正试图找出一些事情的实际实现

A)我有一个使用Java和Clojure的多语言环境。我的Java代码是一个回调类,其方法触发流数据。推送到这些方法的事件数据,就是我想用作喷口的东西

因此,第一个问题是如何将进入这些方法的数据连接到喷口?我正在尝试I)传递backtype.storm.topology.IRichSpout,然后ii)传递backtype.storm.spoute.spoutoutoutputCollector()到该喷口的open函数()。但我看不到一种方法能真正传递任何类型的地图或列表

B)我的项目的其余部分都是Clojure。通过这些方法将会有大量的数据。每个事件的ID介于1和100之间。在Clojure中,我希望将来自喷口的数据拆分为不同的执行线程。我认为,这些将是螺栓

如何设置Clojure螺栓从喷口获取事件数据,然后根据传入事件的ID断开线程

提前谢谢 提姆

[编辑1]

我实际上已经克服了这个问题。我最终实现了自己的虹膜嘴。然后,2)将喷口的内部元组连接到java回调类中的传入流数据。我不确定这是否是惯用语。但它编译和运行时没有错误。但是,3)我没有看到通过printstuff螺栓传入的流数据(肯定在那里)

为了确保事件数据得到传播,在spout或bolt实现或拓扑定义中是否需要做一些特定的事情?谢谢

;; tie Java callbacks to a Spout that I created (.setSpout java-callback ibspout) (storm/defbolt printstuff ["word"] [tuple collector] (println (str "printstuff --> tuple["tuple"] > collector["collector"]")) ) (storm/topology { "1" (storm/spout-spec ibspout) } { "3" (storm/bolt-spec { "1" :shuffle } printstuff ) }) 对B部分的答复:

对我来说,这个简单的答案听起来像是在寻找一个字段分组,这样就可以控制在执行过程中按ID将哪些工作分组在一起


也就是说,我不相信这是一个完整的答案,因为我不知道你为什么要这样做。如果您只是想要一个平衡的工作负载,那么无序分组是一个更好的选择。

似乎您正在将喷口传递给回调类,这似乎有点奇怪。在执行拓扑时,storm将定期调用spouts
nextTuple
方法,因此您需要做的是将java回调传递给您的自定义Spoute实现,以便在storm调用您的Spoute时,Spoute调用java回调以获取下一组要输入拓扑的元组


需要理解的关键概念是,Spouts在storm请求时会拉取数据,而不是将数据推送到Spouts。您的回调不能调用spout将数据推送到它,相反,当您的spout的
nextTuple
方法被调用时,您的spout应该(从某个java方法或任何内存缓冲区)提取数据。

嘿,感谢您的关注。我确实指定了一个:shuffle来平衡工作负载。我现在遇到的问题是,我没有看到我的事件数据传播到我的螺栓(请参阅abouve edit)。谢谢你的任何见解。@NutritusTim你真的知道问题出在哪里了吗?@Vor,没有。暴风雪对我来说似乎太不可行了。现在满足了我的需要。谢谢你的回复,我来看看哦,很好。谢谢你的洞察力。但我仍然没有看到数据通过喷口传到我的螺栓上。我对你的情况作了更好的描述。也许我应该用我的壶嘴做点特别的事?是否有一种特殊的方式将数据结构传递到喷口?谢谢。@Tim你得到答案了吗?嘿。再见。我不能让斯托姆做我想做的事。这是一个更轻的工具,解决了我的问题。嗯。 public class IBSpout implements IRichSpout { /** * Storm spout stuff */ private SpoutOutputCollector _collector; private List _tuple = new ArrayList(); public void setTuple(List tuple) { _tuple = tuple; } public List getTuple() { return _tuple; } /** * Storm ISpout interface functions */ public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) { _collector = collector; } public void close() {} public void activate() {} public void deactivate() {} public void nextTuple() { _collector.emit(_tuple); } public void ack(Object msgId) {} public void fail(Object msgId) {} public void declareOutputFields(OutputFieldsDeclarer declarer) {} public java.util.Map getComponentConfiguration() { return new HashMap(); } }