Как настроить Flume для прослушивания веб-писем api http

Я создал веб-приложение api, которое опубликовано на сервере IIS, я пытаюсь настроить Apache Flume для прослушивания этого веб-api и для сохранения ответа HTTP-петиций в HDFS, это метод почты, который мне нужен слушать:

    [HttpPost]
    public IEnumerable<Data> obtenerValores(arguments arg)
    {
        Random rdm = new Random();

        int ano = arg.ano;
        int rdmInt;
        decimal rdmDecimal;

        int anoActual = DateTime.Now.Year;
        int mesActual = DateTime.Now.Month;

        List<Data> ano_mes_sales = new List<Data>();

        while (ano <= anoActual)
        {
            int mes = 1;
            while ((anoActual == ano && mes <= mesActual) || (ano < anoActual && mes <= 12))
            {
                rdmInt = rdm.Next();
                rdmDecimal = (decimal)rdm.NextDouble();
                Data anoMesSales = new Data(ano, mes,(rdmInt * rdmDecimal));
                ano_mes_sales.Add(anoMesSales);

                mes++;
            }
            ano++;
        }
        return ano_mes_sales;
    }

Flume работает через виртуальную машину VMware VMware, это моя попытка настроить флеш для прослушивания этого приложения:

# Sources, channels, and sinks are defined per # agent name, in this case 'tier1'.
a1.sources  = source1
a1.channels = channel1
a1.sinks    = sink1
a1.sources.source1.interceptors = i1 i2 
a1.sources.source1.interceptors.i1.type = host
a1.sources.source1.interceptors.i1.preserveExisting = false
a1.sources.source1.interceptors.i1.hostHeader = host
a1.sources.source1.interceptors.i2.type = timestamp

# For each source, channel, and sink, set # standard properties.
a1.sources.source1.type     = org.apache.flume.source.http.HTTPSource
a1.sources.source1.bind     = transacciones.misionempresarial.com/CSharpFlume
a1.sources.source1.port     = 80

# JSONHandler is the default for the httpsource # 
a1.sources.source1.handler = org.apache.flume.source.http.JSONHandler
a1.sources.source1.channels = channel1
a1.channels.channel1.type   = memory
a1.sinks.sink1.type         = hdfs
a1.sinks.sink1.hdfs.path = /monthSales
a1.sinks.sink1.hdfs.filePrefix = event-file-prefix-
a1.sinks.sink1.hdfs.round = false
a1.sinks.sink1.channel      = channel1

# Other properties are specific to each type of # source, channel, or sink. In this case, we # specify the capacity of the memory channel.
a1.channels.channel1.capacity = 1000 

Я использую curl для публикации, вот моя попытка:

curl -X POST -H 'Content-Type: application/json; charset=UTF-8' -d '[{"ano":"2010"}]' http://transacciones.misionempresarial.com/CSharpFlume/api/SourceFlume/ObtenerValores

Я получаю только эту ошибку:

{"Message":"Error."}

Мой вопрос в том, что это правильный способ настроить лоток для прослушивания http-петиций на моем веб-апи, что мне не хватает?

Ответ 1

Стандартный Flume 'HTTPSource' и его JSONHandler умолчанию будут обрабатывать событие только в определенном, ориентированном на Flume формате.

Этот формат документирован в руководстве пользователя, а также в комментариях в начале исходного кода JSONHandler.

Таким образом, ожидается получение списка объектов JSON, каждый из которых содержит headers (пары ключ/значение, сопоставленные с заголовками событий Flume) и body (простая строка, сопоставленная с телом событий Flume).

Чтобы взять ваш пример, если вы отправляете:

[{"headers": {}, "body": "{\"ano\":\"2010\"}"}]

Я думаю, вы получите то, что искали.

Если у вас нет возможности изменить то, что вы отправляете, вы можете использовать org.apache.flume.source.http.BLOBHandler, в зависимости от того, какую обработку вы пытаетесь выполнить (NB. В документации нет руководство для этого, только для org.apache.flume.sink.solr.morphline.BlobHandler - они не одно и то же, но есть некоторые примечания в FLUME-2718), или вам может потребоваться предоставить собственную реализацию Flume HTTPSourceHandler интерфейс вместо.

Примечание: для опции HTTP Source bind требуется имя хоста или IP-адрес. Возможно, вам просто повезло, когда ваше значение рассматривается как имя хоста, а путь игнорируется.