一个rabbitMQ客户端的管理应该包含以下内容:
1 获取 connection
2 获取 channel
3 定义 Exchange ,Queue
4 使用一个 Exchange 和 一个 Routingkey 将消息发送到对应的Queue上。
%% Author: root
%% Created: May 9, 2012
%% Description: TODO: Add description to rabbitmq_client_kun
-module(rabbitmq_client_kun).
-include("amqp_client.hrl").
-record(rabbit_client , { connection ,channel }).
-compile([export_all]).
%%
%% new rabbit client created
%%
connect() ->
{ok, Connection}=amqp_connection:start(#amqp_params_network{}),
{ok, Channel} = amqp_connection:open_channel(Connection),
Client = #rabbit_client{
connection = Connection,
channel = Channel
},
{ok, Client}.
%%{ok,{state,<0,106,0>,<0,116,0>}}为返回结果,<>内为进程通道。Erlang语言的特点,每一句都是一个进程。
%%
%% setup Exchange, Queue
%% 主要包括 exchange queue binding。
setup_exchange_queue(Client) ->
Channel = Client#rabbit_client.channel,
#'queue.declare_ok'{}
=amqp_channel:call(Channel, #'queue.declare'{queue = << "kun_Q">>}),
Declare = #'exchange.declare'{ exchange = <<"kun_exchange">>},
#'exchange.declare_ok'{} = amqp_channel:call(Channel, Declare),
% bind queue to exchange
%%Binding = #'queue.unbind'{}
#'queue.bind_ok'{} =
amqp_channel:call( Channel, #'queue.bind'{queue = <<"kun_Q">> ,exchange= <<"kun_exchange">>}),
ok.
%%
%% Publish a message
%%
publish_msg(Client) ->
Channel = Client#rabbit_client.channel,
Payload = <<"Hello kun">>,
Exchange = <<"kun_exchange">>,
%% Publish = #'basic.publish'{exchange = << >> ,routing_key = Q},
amqp_channel:cast(Channel, #'basic.publish'{exchange = Exchange}, #'amqp_msg'{payload=Payload}),
ok.
%%
%% Receiving Message
%%
rec_message(Client) ->
%% Queue = <<"kun_Q">>,
Channel = Client#rabbit_client.channel,
Get = #'basic.get'{queue = <<"kun_Q">> ,no_ack= true},
{#'basic.get_ok'{} ,Content } = amqp_channel:call(Channel, Get),
#amqp_msg{payload = Payload} = Content.
%
rece_message(Client) ->
Channel = Client#rabbit_client.channel,
case amqp_channel:call(Channel, #'basic.get'{queue = <<"kun_Q">> , no_ack = false}) of
{#'basic.get_ok'{delivery_tag = DeliveryTag} , #amqp_msg{payload = Payload}} -> {ok , {DeliveryTag , Payload}};
#'basic.get_empty'{} -> {ok , []};
Other -> {error , Other}
end.
%%
%% closing channels and the connection
%%
close(Client) ->
Channel = Client#rabbit_client.channel,
Connection = Client#rabbit_client.connection,
amqp_channel:close(Channel),
amqp_channel:close(Connection),
ok.
%%
%% 测试函数,用于测试函数的正确与否。Erlang中经常这样做,方便检查程序。
%%
test() ->
{ok, Client} = connect(),
setup_exchange_queue(Client),
publish_msg(Client),
rece_message(Client).