使用storm时如何在bolt的getComponentConfiguration()中访问用户定义的值?

时间:2015-03-12 08:14:24

标签: java apache-storm

我想通过命令行动态初始化我的redis地址,并在使用bolt open方法之前使用它:

public class RunMyTopology {

  @Parameter(names = { "-topologyName"}, description = "Topology name.")
  private static String TOP_NAME = "demo";

  @Parameter(names = { "-redisAddr"}, description = "Redis host address.", validateWith = IPValidator.class)
  public static String REDIS_ADDR =  "172.16.3.142";

  public static void main(String[] args) throws AlreadyAliveException, InvalidTopologyException {   
  new JCommander(new RunMyTopology(), args);

  TopologyBuilder builder = new TopologyBuilder();   
  builder.setSpout("spout", new Spout(REDIS_ADDR), 1);
  builder.setBolt("fixerBolt",new FixerBolt(REDIS_Addr),1).fieldsGrouping("spout", new Fields("busId")); 
  // And many other bolts need REDIS_ADDR
  Config conf = new Config();
  conf.put(Config.TOPOLOGY_WORKERS, 22);
  StormSubmitter.submitTopology(TOP_NAME, new Conf, builder.createTopology());
   }
}

现在我可以通过传递构造函数参数来实现它,但是如果我有很多 配置值像redis地址,这种方式看起来很难看。如何以其他方式通知更改的值?

1 个答案:

答案 0 :(得分:0)

不幸的是,Apache Storm中没有属性的外部化。

但是您可以使用许多可用于此目的的库,例如Spring(占位符API)或Apache Commons Configuration(我个人将它与风暴一起使用,因为它非常轻量级,并且可以很好地完成这项工作)。

如果您打算使用Commons Configuration:

  • 为不同的环境DEV,PROD ...
  • 定义属性文件
  • 您必须首先解析公共配置,并支持属性覆盖(例如,使用环境或系统变量)
  • 然后获取所有内部属性以将它们放入Storm Config(如果你采用所有系统属性,则过滤一些,它可以充满废话)
  • 最后你可以启动你的集群

希望有所帮助。

以下是文档的链接。 http://commons.apache.org/proper/commons-configuration/userguide_v1.10/overview.html#Using_Configuration