我尝试连接Kafka并使用Erlang / ekaf生成一些消息。
代码是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},
<<" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJK">>}].
init_ekaf: start.
run_test: error: {badmatch,{error,{not_started,gproc}}}
run_test: end.
答案 0 :(得分:1)
再次读取存储库中的现有测试后,我发现在启动ekaf之前还需要启动gproc
应用程序。
通过添加:
application:start(gproc)
在application:start(ekaf)
之前,问题就解决了。
P.S:找到解决问题的另一种方法,即调用application:ensure_all_started(ekaf)
而不是application:start(ekaf)
。
如document中所述,ensure_all_started
相当于对尚未为应用程序启动的所有依赖项重复调用start / 1,2