Java 如何访问螺栓中的用户定义值';在使用storm时,是否使用getComponentConfiguration()?
我想通过命令行动态初始化我的redis地址,并在bolt的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
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的默认值,而不是集群模型中更改的值。因此,它不是动态的,在拓扑开始之前只定义一次属性,之后它们不会更改,您描述的似乎是属性的外部化。是吗?是的,你的描述很准确。