Storm框架:如何根據業務條件選擇不同的bolt進行下發訊息

dapan發表於2021-09-09

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!

原文出處:https://www.cnblogs.com/gouyg/p/java_storm_stream.html  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/758/viewspace-2816783/,如需轉載,請註明出處,否則將追究法律責任。

相關文章