在没有订阅者的队列上发布消息时会发生什么?

时间:2017-02-08 02:56:18

标签: rabbitmq jms message-queue amqp stomp

这是在接受采访时向我询问的。

在上午10点没有订阅者的队列上发布消息时会发生什么?并且具有适当过滤器的订户在上午10点22分订阅到相同的队列。在消息到达代理之后订阅者订阅时是否传递消息(我的意思是它在找到订阅者之前存储在内存中)?什么是默认行为? JMS,STOMP和AMQP standerds也有所不同吗?

2 个答案:

答案 0 :(得分:3)

AMQP 代理中,消息要么传递给订阅队列的消费者,要么消费者按需从队列中提取/提取消息。即使此时没有订户处于活动状态,消息也将保留在队列中。如果消息是持久性消息,则将在磁盘上存储消息,如果不持久,则将消息存储在内存中。 https://www.rabbitmq.com/tutorials/amqp-concepts.html

STOMP :RabbitMQ STOMP适配器支持许多不同的目标类型。在没有订户存在时发送的消息将排队,直到订户连接到队列(而当没有连接的订户时,主题将丢弃消息)。 https://www.rabbitmq.com/stomp.html

<强> JMS : JMS是一个API,它不使用任何协议。另一方面,AMQP是消息传递客户端和消息传递服务器之间的协议。 JMS客户端可以使用AMQP作为与消息传递服务器通信的协议。 (查看本文以获取有关主题https://spring.io/understanding/AMQP

的更多信息

但是,发送到队列的消息将保留在队列中,直到该队列的消息使用者消耗它们。 http://docs.oracle.com/javaee/6/tutorial/doc/bnceh.htmlhttps://en.wikipedia.org/wiki/Java_Message_Service

答案 1 :(得分:1)

关于发布者和订阅者的问题,我认为问题是发布 - 订阅消息模式。在Pub / Sub模式中,发布的是主题,而不是队列。

行为取决于消息传递提供程序。如果没有订阅者,消息传递提供者可以丢弃发布。因此,如果在上午10点将消息发布到某个主题,则该发布将被丢弃,因为没有订阅者。现在,当新订户在上午10:02进入时,该发布将不会发送给订户。

IBM MQ中有一个“保留发布”的概念。当发布具有“保留发布”属性集时,IBM MQ队列管理器将为主题保留此类发布的副本,直到为同一主题创建新发布。假设在上午10点发布了“保留发布”的出版物,当订阅者在上午10:02到达时,订阅者将获得该出版物。

希望这有帮助。