Skip to content

Instantly share code, notes, and snippets.

@stwind
Created July 7, 2013 02:28
Show Gist options
  • Save stwind/5942030 to your computer and use it in GitHub Desktop.
Save stwind/5942030 to your computer and use it in GitHub Desktop.
Example req-rep usage of erlzmq
#!/usr/bin/env escript
%%! -pa ebin
%% -*- mode: erlang -*-
%% ex: ft=erlang ts=4 sw=4 et
-mode(compile).
-compile(export_all).
main(_) ->
{ok, Context} = erlzmq:context(1),
{ok, Req1} = erlzmq:socket(Context, req),
{ok, Req2} = erlzmq:socket(Context, req),
{ok, Rep1} = erlzmq:socket(Context, rep),
{ok, Rep2} = erlzmq:socket(Context, rep),
ok = proc_lib:start(?MODULE, broker, [Context]),
ok = erlzmq:connect(Req1, "tcp://127.0.0.1:5559"),
ok = erlzmq:connect(Req2, "tcp://127.0.0.1:5559"),
ok = erlzmq:connect(Rep1, "tcp://127.0.0.1:5560"),
ok = erlzmq:connect(Rep2, "tcp://127.0.0.1:5560"),
ok = erlzmq:send(Req1, <<"req1">>),
ok = erlzmq:send(Req2, <<"req2">>),
{ok, <<"req1">>} = erlzmq:recv(Rep1),
{ok, <<"req2">>} = erlzmq:recv(Rep2),
ok = erlzmq:send(Rep1, <<"rep1">>),
ok = erlzmq:send(Rep2, <<"rep2">>),
{ok, <<"rep1">>} = erlzmq:recv(Req1),
{ok, <<"rep2">>} = erlzmq:recv(Req2),
io:format("hehe ~n").
broker(Context) ->
{ok, Router} = erlzmq:socket(Context, [router, {active, true}]),
{ok, Dealer} = erlzmq:socket(Context, [dealer, {active, true}]),
ok = erlzmq:bind(Router, "tcp://127.0.0.1:5559"),
ok = erlzmq:bind(Dealer, "tcp://127.0.0.1:5560"),
proc_lib:init_ack(ok),
loop(Router, Dealer).
loop(Router, Dealer) ->
receive
{zmq, Router, Msg, Flags} ->
case proplists:get_bool(rcvmore, Flags) of
true ->
erlzmq:send(Dealer, Msg, [sndmore]);
false ->
erlzmq:send(Dealer, Msg)
end;
{zmq, Dealer, Msg, Flags} ->
case proplists:get_bool(rcvmore, Flags) of
true ->
erlzmq:send(Router, Msg, [sndmore]);
false ->
erlzmq:send(Router, Msg)
end
end,
loop(Router, Dealer).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment