如何在STOMP中收到丢失的消息?

时间:2016-02-01 03:55:20

标签: python activemq publish-subscribe stomp

我有一个python脚本,必须在Linux服务器上全天候运行,并通过STOMP从另一台服务器接收ActiveMQ推送通知。可能会发生脚本因任何原因失败并且会停机一段时间,显然最多只能持续30分钟或平均只有几分钟。

我需要收到丢失的消息 - 如果脚本在之前失效,那么在脚本再次启动之后会以某种方式收到通知。据我所知,我的理解是有限的,这是可能的,服务器将在我的脚本启动后发送它们。这就是我认为它是真实的

https://activemq.apache.org/apollo/documentation/stomp-manual.html#Topic_Durable_Subscriptions

  

持久订阅是订阅主题的队列   即使创建持久订阅的客户端不是   在线,他仍然可以获得发送到该主题的所有消息的副本   当他回到网上时。多个客户端可以订阅相同的客户端   持久订阅,因为它由队列支持,那些   订阅者将使主题的消息在它们之间进行负载平衡。

在python中:

import stomp

# ....
conn.subscribe(destination="/topic/some_topic", id=1, ack="auto", headers={"activemq.subscriptionName": "SampleSubscription"})

这是我认为的吗?

一旦它再次出现,我的脚本会收到丢失的消息吗?

“id”是否始终等于1?

更新

以下是我在Python中使用on_message方法收到的标题:

{
'priority': '4', 
'persistent': 'true', 
'message-id': 'fdsfds', 
'expires': '432432432', 
'destination': '/topic/fdsfds', 
'timestamp': '42343243', 
'subscription': '0', 
'type': 'aaaaa'
}

执行“持久”,或许,“订阅”,暗示如果我的客户 - 消费者处于离线状态,那么一旦它再次上线,它将被发送它在离线时丢失的所有消息?

2 个答案:

答案 0 :(得分:2)

对于Apache ActiveMQ,请查看http://activemq.apache.org/stomp.html上的文档。它指定SUBSCRIBE帧上的标头必须是activemq.subscriptionName。

对于ActiveMQ Apollo,请查看https://activemq.apache.org/apollo/documentation/stomp-manual.html#Topic_Durable_Subscriptions

答案 1 :(得分:0)

不,实际上,当服务器脱机时,持久性不会发送丢失的消息; activeMQ中的持久消息意味着当您重新启动activeMQ时,队列中的消息不会丢失,并且将来会保留这些消息。

如果你想使用python和stomp在activemq中发送持久性消息,你必须将以下STOMP头添加到所有SEND请求中:persistent:true。

你必须这样写:

conn.send('queue name', 'message', headers={'persistent':'true'})