我有一个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'
}
执行“持久”,或许,“订阅”,暗示如果我的客户 - 消费者处于离线状态,那么一旦它再次上线,它将被发送它在离线时丢失的所有消息?
答案 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'})