我是Apache Storm的新手。为了理解它,我正在研究Storm教程(https://github.com/apache/storm/tree/master/examples/storm-starter)中提供的Storm示例。
在所有示例中,我们将元组(String,int等)作为元组发出。
在我的用例中,我有一个Java对象,我想将其作为元组发送到螺栓。
我不知道该怎么做。看来我必须实现一个自定义的Tuple生成器来将Java对象转换为Values
。
任何人都可以为我提供一些示例:
对于我的Java对象是:
class Bean
{
int A;
String B;
Bean2 b;
//setters and getters
}
和
class Bean2
{
//Some Attributes
}
现在,在我的nextTuple()
Spout方法中,我有一个Bean
对象的实例。
class Spout implements IRichSpout
{
//...
void nextTuple()
{
Bean b = queue.poll();//queue contains instances of Bean Object
//How to convert this object to tuple and emit it as Tuples???
}
}
如何翻译成Tuple
并发出并通过我的螺栓消耗它。
答案 0 :(得分:2)
有两种可能性:
只发出包含Bean
:
class Spout implements IRichSpout {
void nextTuple() {
Bean b = queue.poll();
collector.emit(new Values(b));
}
}
这是最简单的方法,但有一个缺点,就是你不能使用fieldGrouping(...)
中的各个属性来消耗螺栓。此外,您应该在Kryo中注册Bean
以进行高效(反)序列化:
Config c = new Config();
c.registerSerialization(Bean.class);
StormSubmitter.submitTopology("name", c, builder.createTopology());
单独发出每个属性:
class Spout implements IRichSpout {
void nextTuple() {
Bean b = queue.poll();
// of course, you can also un-nest Bean2
collector.emit(new Values(b.getA(), b.getB(), b.getBean2()));
}
}
这允许使用fieldsGrouping(...)
中的每个属性(或属性组合)。但是,在使用者处,您需要单独检索每个属性并使用setter方法构建新的Bean
对象。
作为第二种方法的替代方案,请参阅How to use apache storm tuple