Apache Storm - 从Config读取YAML列表

时间:2014-12-17 17:07:02

标签: java yaml apache-storm

我正在编写Apache Storm拓扑,它在命令行中接收配置文件。配置文件是YAML,看起来像这样

#Ports
ports:
  - 9998
  - 9997
  - 9996

我使用snakeyaml和以下代码将配置文件加载到Storm配置中,资源设置为配置yaml文件的路径字符串:

Config conf = new Config();
Yaml yaml = new Yaml()
Map rs = (Map) yaml.load(new InputStreamReader(new FileInputStream(resource)));
conf.putAll(rs);

我已验证Config对象现在包含端口列表。如果我打印“端口”的值,它看起来是以下“[9998,9997,9996]”。

我的问题是如何将其转换为Array,ArrayList或我可以在Java中使用的任何数据结构?我一直在使用带有辅助方法get的backtype.storm.utils.Utils类,但只有当我有一个值而不是值列表时它才有效。

我试过这样称呼它:

 String[] ports = Utils.get(conf, "mimes", null); 

但是,我得到了一个转换异常。我也尝试过:

 String ports = Utils.get(conf, "mimes", null); 

检查我是否可以获取整个字符串并且还有一个强制转换异常。我不确定Config对象将此列表存储为什么。一张地图?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

我建议使用Jackson的YAML模块(https://github.com/FasterXML/jackson-dataformat-yaml);这就是像DropWizard这样的许多框架。如果是这样,您可以使用与JSON完全相同的数据绑定来构造POJO以进行配置访问:

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Config config = mapper.readValue(fileOrInputStream, Config.class);
int port = mapper.server.port; // or getters, or however your Config object is laid out

答案 1 :(得分:0)

我不确定答案是什么,但我最终将我的snakeyaml版本更新为1.14并且我现在使用yaml.loadAs()方法直接将yaml文件的cotents加载到pojo中。从那里我能够得到我需要的东西。