2016-11-17 9 views
1

私はKafkaに接続し、Erlang/ekafを使用してメッセージを生成しようとしています。Erlang/ekafを使用してKafkaにデータを生成する際にエラーが発生しました

コードはekafのREADMEで説明されている簡単な例ですが、application:startが呼び出されると終了します。

私はgen_icmp:pingを使用して、このマシンでKafkaを実行しているサーバーにアクセスできることを確認しています。

私はまた、このカフカにいくつかのランダムなメッセージを生成するためにpythonスクリプトを実行しました。それは成功したので、おそらく私が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:start(ekaf)の代わりにapplication:ensure_all_started(ekaf)を呼び出す問題を解決する別の方法が見つかりました。 documentで説明したように、ensure_all_startedは、アプリケーションに対してまだ開始されていないすべての依存関係に対してstart/1,2を繰り返し呼び出すのと同等です。

関連する問題