Rabbitmq 处理主题路由的路由密钥

Rabbitmq 处理主题路由的路由密钥,rabbitmq,erlang,otp,gen-server,Rabbitmq,Erlang,Otp,Gen Server,我对Erlang环境有点陌生 我正在编写一个电子邮件测试应用程序,它在主题交换中使用随机生成的路由密钥过滤传入的电子邮件,使电子邮件进入我的系统 一旦它们在队列中被传递(和处理),我想用之前的随机路由_键再次标记它们,将它们路由到另一个exchange,以便为最终消费做好准备 这第二个生产步骤给我带来了真正的麻烦 我从一个tcp套接字(由第三层程序:spamassassin处理)获取数据,该套接字具有句柄\信息模式匹配 我依靠gen_服务器首先通过常规的amqp_client/include/a

我对Erlang环境有点陌生

我正在编写一个电子邮件测试应用程序,它在主题交换中使用随机生成的路由密钥过滤传入的电子邮件,使电子邮件进入我的系统

一旦它们在队列中被传递(和处理),我想用之前的随机路由_键再次标记它们,将它们路由到另一个exchange,以便为最终消费做好准备

这第二个生产步骤给我带来了真正的麻烦

我从一个tcp套接字(由第三层程序:spamassassin处理)获取数据,该套接字具有句柄\信息模式匹配

我依靠gen_服务器首先通过常规的amqp_client/include/amqp_client.hrl库使用消息

我在gen_服务器行为中使用handle_info,然后在参数上进行模式匹配

通过handle_info回调中的函数头(记录)检测传递的AMQP消息

TCP套接字很适合与spamassassin交谈,它返回一个包含二进制字符串数据的3元组,如下所示:

{tcp,#端口,}

第二个handle_info中的循环与侦听gen_tcp服务器的答案匹配OK,但我必须进行打包以将其发送到主题交换(主题交换电子邮件交换)

***我的发电机服务器****
handle#info({#'basic.deliver'{routing#key=key,consumer#tag=tag},Content},State)->
#amqp_msg{props=Properties,payload=payload}=Content,
#'P_basic'{message_id=MessageId,headers=headers}=Properties,
发送给spamassassin:计算分数(有效载荷),
{诺雷普利州};
句柄信息(消息,状态)->
味精案例
{{{,},数据}->
电子邮件:主(数据);
{_,_} ->
完,,
{诺雷普利州}。
***发送到spamassassin函数***
计算分数(信息)->
case gen_tcp:connect(“localhost”,783,[{mode,binary}])的
{好的,袜子}->
…
gen_tcp:send(Sock,Message2);
{错误,{}->
io:fwrite(“连接错误!正在退出…~n”)
结束。
***电子邮件***
主(Argv)->
{ok,Connection}=amqp_Connection:start(#amqp_params_network{virtual_host=}),
{ok,Channel}=amqp_连接:打开_通道(连接),
amqp_通道:调用(通道,#'exchange.declare'{exchange=,type=}),
{RoutingKey,Message}=的Argv案例
…
%在这里进行模式匹配
…
完,,
amqp_通道:cast(通道,#'basic.publish'{exchange=,routing#u key=RoutingKey},#amqp_msg{payload=Message})
第一个问题是数据类型(二进制字符串),但我想这可能是使用BIF binary_to_元组或类似的东西的一种解决方法

我很难理解的是如何传递正确的路由键,因为Erlang是功能性的,没有副作用或分配

这种格式数据的变化(AMQP-->原始TCP-->然后又是AMQP)似乎不可能(在我看来)通过OTP抽象实现

然而,我想用上面5行匹配的正确路由密钥重新组装每个已处理的消息

我如何修改我的代码才能做到这一点?我来自命令式语言,在这里达到了我的极限

你的

第一个问题是数据类型(二进制字符串),但我想它可以 使用BIF二进制到元组或诸如此类的东西来解决问题

在所有语言中,您都必须弄清楚如何解析从套接字读取的数据

我很难理解的是我怎样才能通过正确的考试 路由键,因为Erlang是功能性的,所以没有副作用或 分配

这是党的路线,但在现实中,递归函数的参数变量可以用来存储值。在您的情况下,您可以将路由密钥存储在
State
变量中,该变量在所有gen_服务器回调函数中都可用<如果需要,code>State可以是30个元素的元组,因此可以在
State
变量中存储多少信息没有限制

另一种选择是使用ets/dets表(即erlang数据库)存储带有路由键的消息,直到您准备好发送所有信息?到另一个过程

{RoutingKey,Message}=

然而,我想用 右路由键与上面的5行匹配

如果您在同一功能中,是什么阻止您使用变量
RoutingKey
message
中的路由键和消息?我不清楚如果所有的代码都在一个函数中,怎么会有问题。我想你可以这样做:

{RoutingKey, Message} = ...
ProcessedMsg = process_this(Message)
{RoutingKey, ProcessedMsg}
我建议您发布一个简单的问题示例——不需要所有复杂的匹配和amqp_频道内容来将问题提取到核心,例如

handle_info(Msg, State) -> 
    RoutingKey = 3,
    ProcessedMsg = "hello",

    %% Here, I want to write: ....
第一个问题是数据类型(二进制字符串),但我想它可以 使用BIF二进制到元组或诸如此类的东西来解决问题

在所有语言中,您都必须弄清楚如何解析从套接字读取的数据

我很难理解的是我怎样才能通过正确的考试 路由键,因为Erlang是功能性的,所以没有副作用或 分配

这是党的路线,但在现实中,递归函数的参数变量可以用来存储值。在您的情况下,您可以将路由密钥存储在
State
变量中,该变量在所有gen_服务器回调函数中都可用<如果需要,code>State可以是30个元素的元组,因此可以在
State
变量中存储多少信息没有限制

另一种选择是使用ets/dets表(即erlang数据库)存储带有路由键的消息,直到您准备好发送所有信息?到另一个过程

{RoutingKey,Message}=

然而,我想用 R
handle_info(Msg, State) -> 
    RoutingKey = 3,
    ProcessedMsg = "hello",

    %% Here, I want to write: ....