Strom框架基本概念就不提了,这里主要讲的是Stream
自定义ID的消息流。默认spout、bolt都需实现接口方法declareOutputFields
,代码如下:
@Overridepublic void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) { outputFieldsDeclarer.declare(new Fields("body")); }
这种情况下发的消息会被所有定义的bolts接收。我们如果需要根据得到的消息类型来选择不同的bolt,就需要用到Stream Grouping。
首先通过消息源的
OutputFieldsDeclarer
来定义发射多条消息流stream
以下定义了两种stream消息流:email邮件、sms短信
@Overridepublic void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) { outputFieldsDeclarer.declareStream("email", new Fields("body")); outputFieldsDeclarer.declareStream("sms", new Fields("body")); }
然后我们通过对消息内容进行分析判断来决定发射指定的stream类型
@Overridepublic void execute(Tuple tuple) { String streamType; String value = tuple.getStringByField("body"); # 逻辑判断stub code if (value.startsWith("email:")) { streamType = "email"; } else { streamType = "sms"; } outputCollector.emit(streamType, new Values(value)); }
topology设置bolt的消息源时通过localOrShuffleGrouping来设置只接收指定stream的消息
FilterBolt通过对消息进行加工处理,下发给bolts时会指定不同的stream,EmailNotifyBolt只接收email
类型的stream消息,SmsNotifyBolt只接收sms
类型的stream消息。
TopologyBuilder topologyBuilder = new TopologyBuilder(); topologyBuilder.setSpout("RabbitmqSpout", new RabbitmqSpout()); topologyBuilder.setBolt("FilterBolt", new FilterBolt()).shuffleGrouping("RabbitmqSpout"); topologyBuilder.setBolt("EmailNotifyBolt", new EmailNotifyBolt()).localOrShuffleGrouping("FilterBolt", "email"); topologyBuilder.setBolt("SmsNotifyBolt", new SmsNotifyBolt()).localOrShuffleGrouping("FilterBolt", "sms");
Hey, show me the code!
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦