当前位置: 首页 > 知识库问答 >
问题:

RabbitMQ使用自定义标头来存储消息参数

公西俊民
2023-03-14

我是新的RabbitMQ,我有点迷失在留档。

目前,例如,我正在尝试构建一个侦听队列的小型邮件服务,但我有点卡在我应该在哪里放置我的服务具有的参数(目的地、主题......

我应该将它们放在某种编码格式(json)中,放在我的消息中,还是应该使用头结构,如下例所示:

string message = "Hello World!";
var body = Encoding.UTF8.GetBytes(message);

var properties = new BasicProperties();
properties.Headers = new Dictionary<string, object>();
properties.Headers.Add("destination", "matthias123@localhost");

channel.BasicPublish(exchange: "", routingKey: "sendmail", basicProperties: properties,body: body);

使用标头是否提供额外的好处?例如,是否可以过滤发送到特定目的地的消息?

共有1个答案

帅颖逸
2023-03-14

我不会将标题用于您要做的事情。在我看来,这些信息属于消息的正文。

这么看吧:

邮件正文应包含完成请求的工作所需的一切。在这种情况下,它将是发件人、主题、电子邮件内容等。

另一方面,标头是有关AMQP消息的数据位,而不是消息内容。

这里有很多潜在的混淆,你的工作是“电子邮件”。AMQP 邮件和电子邮件之间的术语重叠太多。

话虽如此,我将选择一个不同的工作示例来做:计算斐波纳契序列。

在这种情况下,您通过Rabbitmq发送的消息将包含一些内容,例如要预先计算多少斐波纳契位置,然后再发送多少斐波纳契位置。

例如,您可能会发送这样的消息(在这种情况下为json):

{
  start: 1,
  take: 3
}

这应该会产生1,1,2的结果,因为它从第一个位置开始并从序列中返回3个项目。

使用您的特定问题和逻辑:我应该将开始采取属性放入消息的标头中吗?

不。

如果我这样做了,那就意味着我的消息是空的,因为所有关于要做的工作的信息都包含在标题中。

当我这样看的时候,这没有意义,因为现在没有消息要发送……只有标头。

另一方面,如果我将这两点数据保存在消息正文中,那么作为发送关于AMQP消息本身的元数据的一种方式,头将变得更加有用……不是关于消息内容的信息,而是关于消息想法的信息。

在这种情况下,我是说我想从斐波纳契序列中返回项目。换句话说,我正在进行RPC(远程过程调用)并期望返回值。

AMQP 不支持直接返回值。但是,我能做的是将队列名称填充到标头中,并将结果发送到该队列。然后,请求斐波那契数的代码可以侦听该队列并获得结果。

所以在发送消息时,我可能会这样做:

var properties = new BasicProperties();
properties.Headers = new Dictionary();
properties.Headers.Add("return-queue", "fibreturn");

在这里,我在标头内部设置了一个“返回队列”标头——关于消息的信息,或者在这种情况下请求信息。处理斐波纳契序列的代码将读取这个标头并将响应发送回这个队列。

这是更好地使用标头,因为它使标头存储关于消息的信息…在这种情况下,响应应该发送到哪里。但是,标题不包含要完成的实际工作的信息。这些都直接存储在消息正文中。

另外,我故意不使用“回复”属性,就像您通常应该使用的那样,来执行RCP。我用这个例子来说明为什么你不应该把你的“目的地”放在标题中。为了更好地实现fibonacci序列思想,请参阅RMQ文档以及它如何正确使用“回复”https://www.rabbitmq.com/tutorials/tutorial-six-dotnet.html

 类似资料:
  • 我试图在我的邮件中添加自定义标题,所以每当异常发生并最终出现在死信队列中时,我都可以看到异常是什么。然而,我所有的尝试都失败了。 使用。setHeader() 在outMessage上设置标题 正在设置exchange的属性 不允许将异常设置为有效负载中的属性。 RABBITMQ字符串:

  • 我试图用Spring Cloud Stream创建一个kafka使用者,以便监听在任何Spring上下文之外构建的kafka消息,并使用自定义头(operationType)。 我使用的是Spring Boot 1.5.x/Spring Cloud egdware.sr5和1.1.1版本的kafka-client和Kafka2.11。 我的侦听器类包含此方法 而operationType标头是存在

  • 这样的消息在开发环境中很好,但是在生产环境中,我们不能在浏览器中向用户显示这一点。所以我想知道谷歌云存储中是否有定制这些消息和页面的规定。 提前感谢, 约杰什

  • null null 示例GET请求 我可以从以下示例URL获取位置列表: 请求标头 null null

  • 简介 此消息 用来接收 用户自定义TOPIC消息 发送过来的事件。 消息体 ChannelMessageBean 例子 Kotlin @Subscribe(threadMode = ThreadMode.MAIN) fun onReceiveCustomMessage(customEvent: ChannelMessageBean) { // TODO } ChannelMessageB

  • 有没有办法配置默认消息 或 在上面的示例中,