Лямбда-функции в конфигурациях штормовых потоков - PullRequest
0 голосов
/ 11 октября 2018

Мне нужно передать лямбда-функцию в качестве параметра конструктору или методу в файле конфигурации YAML для потока (будет использоваться Apache Storm).

Например, скажем, я хочу создать экземплярorg.apache.storm.kafka.spout.ByTopicRecordTranslator.У него есть конструктор со следующей подписью:

public ByTopicRecordTranslator(Func<ConsumerRecord<K, V>, List<Object>> func, Fields fields)

В Java я бы создал его так:

ByTopicRecordTranslator<String, String> translator = new ByTopicRecordTranslator<>((K) -> new Values(K.value()), new Fields("oneOrMoreStrings"));

Но я не могу понять, как это сделатьв файле конфигурации потока YAML.Вот код, который я попытался выполнить, но он потерпел неудачу:

  - id: "field"
    className: "org.apache.storm.tuple.Fields"
    constructorArgs:
      - ["oneOrMoreStrings"]

  - id: "KafkaMessageTranslator"
    className: "org.apache.storm.kafka.spout.ByTopicRecordTranslator"
    constructorArgs:
      - (K) -> new Values(K.value())
      - ref: "field"

Вот ошибка, которую я получил:

Exception in thread "main" java.lang.IllegalArgumentException: Couldn't find a suitable constructor for class 'org.apache.storm.kafka.spout.ByTopicRecordTranslator' with arguments '[(K) -> new Values(K.value()), [oneOrMoreStrings]]'.
    at org.apache.storm.flux.FluxBuilder.buildObject(FluxBuilder.java:358)
    at org.apache.storm.flux.FluxBuilder.buildComponents(FluxBuilder.java:421)
    at org.apache.storm.flux.FluxBuilder.buildTopology(FluxBuilder.java:101)
    at some.package.KafkaConsumerTestTopology.main(KafkaConsumerTestTopology.java:20)

Я не могу найти информацию об этом в документах flux.Я вполне уверен, что это связано с тем, как я форматирую лямбду.

Как передать лямбда-функцию в качестве параметра конструктору или методу в файле конфигурации YAML для потока?

...