Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何访问螺栓中的用户定义值';在使用storm时,是否使用getComponentConfiguration()?_Java_Apache Storm - Fatal编程技术网

Java 如何访问螺栓中的用户定义值';在使用storm时,是否使用getComponentConfiguration()?

Java 如何访问螺栓中的用户定义值';在使用storm时,是否使用getComponentConfiguration()?,java,apache-storm,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 ho

我想通过命令行动态初始化我的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 address这样的配置值,这种方式看起来很难看。如何以其他方式通知更改的值

不幸的是,ApacheStorm中没有外部化属性

但是您可以使用许多可用于此目的的库,例如Spring(占位符API)或Apache Commons配置(我个人将其与storm一起使用,因为它非常轻量级,并且做得足够好)

如果您计划使用Commons配置:

  • 为不同的环境定义属性文件开发人员、产品
  • 您必须首先解析commons配置,并支持属性覆盖(例如使用环境或系统变量)
  • 然后将所有属性放入Storm配置中(如果您获取所有系统属性,则会过滤一些,这可能是一堆废话)
  • 最后,您可以启动集群
希望有帮助

这里是文档的链接。

我的问题与几乎相同,但我需要在声明输出字段之前访问它们,并且我的配置是动态的,不能存储在静态类中。您所说的“动态”是什么意思请描述您的用例。在Storm中动态更新配置的方法有很多。我更改了问题的描述,可以使用
Storm jar me.kangkona.demo-0.0.1.jar me.kangkona.demo.runprepreprocesstopology-redisAddr 172.16.3.140
通过
参数
来更改REDIS_ADDR的值。但问题是,Bolt将访问REDIS_ADDR的默认值,而不是集群模型中更改的值。因此,它不是动态的,在拓扑开始之前只定义一次属性,之后它们不会更改,您描述的似乎是属性的外部化。是吗?是的,你的描述很准确。