说实话storm功能非常强大,但是参考资料是在是太少了,有些只能自己摸索,项目中用到了fieldsGroup,所以就研究一下。
fieldsGroup的机制是把declar中暴露定义的Fields中的字段进行hash,然后分到不同的bolt中,开始理解有误,所以一直跑不通。囧
直接上代码
在第一个spout中
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("word","order"));
}
其中order是自定义对象。
public void nextTuple() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int i=r.nextInt(4);
String str=arr[i];
Order o=new Order(str);
collector.emit(new Values(str,o));
}
这里注意emit中我把前面declar中定义的字段都放入到values对象中(Values底层就是list)
在第二个bolt中
public void execute(Tuple input) {
Order o=(Order) input.getValue(1);
jedis.lpush(o.getOrder(), o.getOrder());
collector.ack(input);
}
这里从tuple中获得自定义对象需要input.getValue(1)说明对象在集合的第二个位置。
在main方法中
builder.setSpout("mySpout", new MySpout(),1);
builder.setBolt("myBolt", new MyBolt(),4).fieldsGrouping("mySpout", new Fields("word","order"));
这里定义bolt分组策略时一定要选fieldsGrouping,并且还要定义Fields中跟spout中的declar中声明的Fields一样的内容才可以。
这里还可以在delcar.declarStream申明流的名称,这里不多解释了。