2016-11-17 3 views
1

Я пытаюсь подключить Kafka и создавать сообщения с использованием Erlang/ekaf.Ошибка при получении данных в Kafka с использованием Erlang/ekaf

Код является простым примером, описанным в README ekaf, но выйдет, когда вызывается application:start.

Обратите внимание, что я использовал gen_icmp:ping, чтобы убедиться, что сервер, на котором работает Kafka, доступен для этого аппарата.

Я также запускаю скрипт python для создания некоторого случайного сообщения для этой Kafka, и это было успешно, поэтому, скорее всего, я кое-что пропустил в своем коде Erlang. :)

Источник:

-module(kafka). 
-compile(export_all). 


run_test() -> 
    io:format("run_test: start.~n"), 
    pingKafka(), 

    try init_ekaf() of 
     _ -> io:format("run_test: ok~n") 
    catch 
     error:Msg -> io:format("run_test: error: ~p~n", [Msg]); 
     throw:Msg -> io:format("run_test: throw: ~p~n", [Msg]); 
     exit:Msg -> io:format("run_test: exit: ~p~n", [Msg]) 
    end. 


init_ekaf() -> 
    io:format("init_ekaf: start.~n"), 

    application:load(ekaf), 
    application:set_env(ekaf, ekaf_bootstrap_broker, {"kafka.dev", 9092}), 
    ok = application:start(ekaf), 
    io:format("init_ekaf: started.~n"), 

    Topic = <<"foobar">>, 
    ekaf:produce_sync(Topic, <<"some data">>), 
    io:format("init_ekaf: message sent.~n"), 
    ok. 


pingKafka() -> 
    Res = gen_icmp:ping("kafka.dev"), 
    io:format("pingKafka: ~p.~n", [Res]), 
    ok. 

Выход:

run_test: start. 
pingKafka: [{ok,"kafka.dev", 
       {192,168,0,51}, 
       {192,168,0,51}, 
       {12343,0,64,130}, 
       <<" !\"#$%&'()*+,-./:;<=>[email protected]">>}]. 
init_ekaf: start. 
run_test: error: {badmatch,{error,{not_started,gproc}}} 
run_test: end. 

ответ

1

После прочтения существующих тестов в хранилище снова, я считаю, что gproc приложение также должны быть запущены перед запуском ekaf.

Так, добавив:

application:start(gproc) 

перед application:start(ekaf), проблема решена.

P.S: Нашел другой способ решить проблему, которая вызывает application:ensure_all_started(ekaf) вместо application:start(ekaf). Как упоминалось в document, ensure_all_started эквивалентно вызову start/1,2 для всех зависимостей, которые еще не запущены для приложения

Смежные вопросы