Un premier exemple utilisant l’API Sarracenia Moth
Sarracenia est un package conçu pour annoncer la disponibilité de nouvelles données, généralement sous forme de fichiers. Nous plaçons les fichiers sur des serveurs standard, les rendons disponibles via le Web ou sftp, et informons les utilisateurs qu’ils sont arrivés à l’aide de messages.
Sarracenia utilise des protocoles de transmission de messages standard existants, comme rabbitmq/AMQP pour transporter les messages, et dans les cercles de transmission de messages, car le serveur qui distribue les messages est appelé un courtier (broker).
Nous appelons la combinaison d’un courtier de messages et d’un serveur de fichiers (qui peut être un serveur unique ou un grand cluster) une pompe de données (data pump).
En supposant que vous avez installé le paquet metpx-sr3, soit en tant que paquet debian, ou via pip, les annonces d’accès à sens unique à utiliser avec la classe sarracenia.moth (Messages Organisés par les en-têtes de sujet), qui permet à un programme python de se connecter à un serveur Sarracenia, et commencer à recevoir des messages qui annoncent des ressources.
La fabrique pour construire les objets sarracenia.moth prend deux arguments :
courtier : un objet (Credential) contenant une url pointant vers le serveur de messagerie qui annonce des produits, et d’autres options associées.
options : un dictionnaire d’autres paramètres que la classe pourrait utiliser.
L’exemple ci-dessous construit un appel à un courtier auquel tout le monde peut accéder et demander 10 annonces.
Vous pouvez l’exécuter, puis nous pourrons discuter de quelques paramètres :
[1]:
import sarracenia.moth
import sarracenia.moth.amqp
import sarracenia.config.credentials
import sarracenia.config.subscription
import time
import socket
options = sarracenia.moth.default_options()
options.update(sarracenia.moth.amqp.default_options)
options['broker'] = sarracenia.config.credentials.Credential(
'amqps://anonymous:anonymous@hpfx.collab.science.gc.ca')
# binding tuple: consists of prefix, exchange, rest.
# effect is to bind from queue using prefix/rest to exchange.
options['queueShare'] = 'SomethingHelpfulToYou'
# Note: queue name must start with q_<username> because server is configured to deny anything else.
#
options['queueName'] = 'q_${BROKER_USER}_${HOSTNAME}_${QUEUESHARE}'
queue = {'name': 'q_anonymous_' + socket.getfqdn() + '_' + options['queueShare'],
'template': options['queueName'],
'auto_delete' : False, # AO == amqp only
'clean_session': True, # MO == mqtt only.
'durable': True, # AO: queue should survive broker reboots
'expire': 600 , # MO: seconds until queue with no consumers disappears.
'max_inflight_messages': 0, # MO: flow control.
'max_queued_messages': 0,
'prefetch': 25,
'qos': 1,
'receiveMaximum': 0,
'tlsRigour': 'normal',
'bind': True, # whether to bind queues/subscriptions
'declare': True # whether to declare queues/subscriptions
}
options['subscriptions'] = sarracenia.config.subscription.Subscriptions( [ {
'broker': options['broker'],
'bindings': [ { 'exchange':'xpublic', 'prefix': ['v02','post'], 'sub':['*','WXO-DD','observations','swob-ml','#'] } ],
'queue' : queue
} ] )
options['subscription_index'] = 0
# turn on debug output for these classes.
#options['settings'] = {}
#options['settings']['sarracenia.moth.mqtt.MQTT'] = { 'logLevel':'debug' }
#options['settings']['sarracenia.moth.amqp.AMQP'] = { 'logLevel':'debug' }
#options['logLevel'] = 'debug'
print('options: %s' % options)
options: {'acceptUnmatched': True, 'batch': 25, 'broker': <sarracenia.config.credentials.Credential object at 0x73589abe3410>, 'dry_run': False, 'exchange': None, 'expire': None, 'inline': False, 'inlineEncoding': 'guess', 'inlineByteMax': 4096, 'logFormat': '%(asctime)s [%(levelname)s] %(name)s %(funcName)s %(message)s', 'logLevel': 'info', 'messageDebugDump': False, 'message_strategy': {'reset': True, 'stubborn': True, 'failure_duration': '5m'}, 'messageAgeMax': 0, 'topicPrefix': ['v03'], 'tlsRigour': 'normal', 'auto_delete': False, 'durable': True, 'exchangeDeclare': True, 'persistent': True, 'prefetch': 25, 'queueBind': True, 'queueDeclare': True, 'reset': False, 'subtopic': [], 'vhost': '/', 'queueShare': 'SomethingHelpfulToYou', 'queueName': 'q_${BROKER_USER}_${HOSTNAME}_${QUEUESHARE}', 'subscriptions': [{'broker': <sarracenia.config.credentials.Credential object at 0x73589abe3410>, 'bindings': [{'exchange': 'xpublic', 'prefix': ['v02', 'post'], 'sub': ['*', 'WXO-DD', 'observations', 'swob-ml', '#']}], 'queue': {'name': 'q_anonymous_idefix.local_SomethingHelpfulToYou', 'template': 'q_${BROKER_USER}_${HOSTNAME}_${QUEUESHARE}', 'auto_delete': False, 'clean_session': True, 'durable': True, 'expire': 600, 'max_inflight_messages': 0, 'max_queued_messages': 0, 'prefetch': 25, 'qos': 1, 'receiveMaximum': 0, 'tlsRigour': 'normal', 'bind': True, 'declare': True}}], 'subscription_index': 0}
Le paramètre courtier(broker) est un objet contenant une URL conventionnelle et d’autres options, indiquant le protocole de messagerie à utiliser pour accéder au serveur en amont. Lorsque vous vous connectez à un courtier, vous devez lui indiquer les messages qui vous intéressent. Dans Moth, tous les courtiers auxquels nous accédons doivent utiliser des hiérarchies de sujets. Vous pouvez les voir si vous avez exécuté avec succès l’exemple ci-dessus, il devrait y avoir dans les impressions de message un élément “sujet”(topic) dans les dictionnaires. En voici un exemple :
v02.post.20210213.WXO-DD.observations.swob-ml.20210213.CTZR
Celle-ci se divise en deux parties :
topic_prefix: v02.post
le reste de l’arborescence des rubriques est le reflet du chemin vers le produit annoncé, par rapport à un répertoire de base.
Dans AMQP, il y a le concept des “échanges” qui sont en quelque sorte comparables aux chaînes de télévision… ce sont des regroupements d’annonces. donc pour se connecter à un courtier AMQP, il faut spécifier:
exchange: Sarracenia promulgue xpublic comme défaut conventionnel.
topic_prefix: décidez quelle version des messages vous souhaitez obtenir. Ce serveur produit des v02.
subtopic: à quel sous-ensemble de messages topic_prefix voulons-nous nous abonner.
Liaisons
L’option de liaisons définit les trois valeurs ci-dessus. dans l’exemple, les liaisons sont :
topic_prefix: v02.post (obtenir des messages v02.)
exchange: xpublic (celui par défaut.)
subtopic: # ( un joker AMQP signifiant tout. )
on se connecte au courtier
amqp://hpfx.collab.science.gc.ca, sur l’échange xpublic, et nous serons intéressés par tous les messages correspondant à la spécification de sujet v02.post.#… (c’est-à-dire tous les messages v02 disponibles .)
sous-thème
Le sous-thème ici ( # ) correspond à tout ce qui est produit sur le serveur. Plus le sous-thème est large, plus il y a de messages à envoyer et plus le traitement est important. Il est préférable de le rendre plus étroit. En prenant l’exemple ci-dessus, si nous sommes intéressés par swob, un sous-thème comme:
*.WXO-DD.observations.swob-ml.#
correspondrait à tous les swobs similaires à celui ci-dessus, mais évitez de vous envoyer des messages pour des non-swobs.
queue_name
Par convention, dans les courtiers administrés par Sarracenia, les utilisateurs ne peuvent créer que des files d’attente commençant par q_ suivi de leur nom d’utilisateur. nous nous sommes connectés en tant qu’anonymes, et donc q_anonymous doit être utilisé. Après cela, le reste peut être ce que vous voulez, mais il y a quelques considérations :
Si vous souhaitez démarrer plusieurs processus Python pour partager un flux de données, ils spécifient tous le même nom de file d’attente et ils partageront le flux de messages. Il s’adapte bien à quelques dizaines de téléchargeurs coopérants, mais ne s’adapte pas à l’infini, ne vous attendez pas à plus d’environ 99 processus pour pouvoir partager efficacement une charge à partir d’une seule file d’attente. Pour évoluer au-delà de cela avec AMQP, plusieurs sélections sont préférables.
si vous allez demander de l’aide aux administrateurs de la pompe de données … vous devrez leur fournir le nom de la file d’attente, et ils devront peut-être pouvoir le choisir parmi des centaines ou des milliers qui se trouvent sur le serveur.
Messages
Différents protocoles de messagerie ont différentes structures et conventions de stockage. la classe MoTH renvoie les messages sous forme de dictionnaires python, quel que soit le protocole utilisé pour les obtenir ou, en cas de transfert, pour les transmettre. On peut ajouter des champs pour une utilisation programmatique aux messages simplement en ajoutant des éléments au dictionnaire. S’ils sont uniquement destinés à un usage interne, ajoutez le nom de l’élément du dictionnaire à la clé spéciale ‘_deleteOnPost’, afin que l’élément du dictionnaire soit supprimé lors du transfert du message.
Ack
Les messages sont marqués en transit par le courtier, et si vous ne les reconnaissez pas, la pompe de données les conservera et les réexpédiera éventuellement. conserver les messages en attente en mémoire ralentira également le traitement de tous les messages. Il faut accuser réception des messages dès que possible, mais pas si tôt que vous perdrez des données si le programme est interrompu. Dans l’exemple, nous reconnaissons après avoir fait notre travail d’impression du message.
[2]:
h = sarracenia.moth.Moth.subFactory(options)
count=0
bon=0 # compteur des messages bien reçus
while count < 5:
m = h.getNewMessage() #get only one Message
if m is not None:
print("message %d: %s" % (count,m) )
content = m.getContent()
print("le premier 50 octets du fichier annoncé: %s" % content[0:50])
bon += 1
h.ack(m)
time.sleep(0.1)
count += 1
h.cleanup() # remove server-side queue defined by Factory.
h.close()
print( f"{bon} messages bien reçus")
2025-05-14 12:49:49,752 [INFO] sarracenia.moth.amqp _queueDeclare queue declared q_anonymous_idefix.local_SomethingHelpfulToYou (as: amqps://anonymous@hpfx.collab.science.gc.ca), (messages waiting: 0)
2025-05-14 12:49:49,753 [INFO] sarracenia.moth.amqp getSetup binding q_anonymous_idefix.local_SomethingHelpfulToYou with v02.post.*.WXO-DD.observations.swob-ml.# to xpublic (as: amqps://anonymous@hpfx.collab.science.gc.ca)
2025-05-14 12:49:49,798 [INFO] sarracenia getContent retrieving from: https://hpfx.collab.science.gc.ca//20250514/WXO-DD/observations/swob-ml/20250514/CWZE/2025-05-14-1648-CWZE-AUTO-minute-swob.xml
message 0: {'_format': 'v02', '_deleteOnPost': {'_format', 'subscription_index', 'local_offset', 'ack_id', 'subtopic', 'exchange', 'topic'}, 'sundew_extension': 'DMS:WXO_RENAMED_SWOB2:MSC:XML::20250514164922', 'from_cluster': 'DDSR.CMC', 'to_clusters': 'ALL', 'filename': 'msg_ddsr-WXO-DD_b52e217f2a58e6f0e05979adf9fd954f:DMS:WXO_RENAMED_SWOB2:MSC:XML::20250514164922', 'mtime': '20250514T164924.165', 'atime': '20250514T164924.165', 'pubTime': '20250514T164924.165', 'baseUrl': 'https://hpfx.collab.science.gc.ca', 'relPath': '/20250514/WXO-DD/observations/swob-ml/20250514/CWZE/2025-05-14-1648-CWZE-AUTO-minute-swob.xml', 'subtopic': ['', '20250514', 'WXO-DD', 'observations', 'swob-ml', '20250514', 'CWZE', '2025-05-14-1648-CWZE-AUTO-minute-swob.xml'], 'identity': {'method': 'md5', 'value': '/ZpPHtpINmNMYH/Zj1jiqw=='}, 'size': 10500, 'exchange': 'xpublic', 'topic': 'v02.post.20250514.WXO-DD.observations.swob-ml.20250514.CWZE', 'ack_id': {'delivery_tag': 1, 'channel_id': 2, 'connection_id': '9559125c-2ebb-46e6-9ae6-3953c683a253_sub', 'broker': 'hpfx.collab.science.gc.ca:5671//'}, 'local_offset': 0, 'subscription_index': 0}
2025-05-14 12:49:50,326 [INFO] sarracenia getContent retrieving from: https://hpfx.collab.science.gc.ca//20250514/WXO-DD/observations/swob-ml/20250514/CWVU/2025-05-14-1623-CWVU-AUTO-minute-swob.xml
le premier 50 octets du fichier annoncé: b'<?xml version="1.0" encoding="UTF-8" standalone="n'
message 1: {'_format': 'v02', '_deleteOnPost': {'_format', 'subscription_index', 'local_offset', 'ack_id', 'subtopic', 'exchange', 'topic'}, 'sundew_extension': 'DMS:WXO_RENAMED_SWOB2:MSC:XML::20250514164922', 'from_cluster': 'DDSR.CMC', 'to_clusters': 'ALL', 'filename': 'msg_ddsr-WXO-DD_a028bf3f18904855a2ab73bb504846a6:DMS:WXO_RENAMED_SWOB2:MSC:XML::20250514164922', 'mtime': '20250514T164924.165', 'atime': '20250514T164924.165', 'pubTime': '20250514T164924.165', 'baseUrl': 'https://hpfx.collab.science.gc.ca', 'relPath': '/20250514/WXO-DD/observations/swob-ml/20250514/CWVU/2025-05-14-1623-CWVU-AUTO-minute-swob.xml', 'subtopic': ['', '20250514', 'WXO-DD', 'observations', 'swob-ml', '20250514', 'CWVU', '2025-05-14-1623-CWVU-AUTO-minute-swob.xml'], 'identity': {'method': 'md5', 'value': 'obON514oZIaun0t3JycELQ=='}, 'size': 9694, 'exchange': 'xpublic', 'topic': 'v02.post.20250514.WXO-DD.observations.swob-ml.20250514.CWVU', 'ack_id': {'delivery_tag': 2, 'channel_id': 2, 'connection_id': '9559125c-2ebb-46e6-9ae6-3953c683a253_sub', 'broker': 'hpfx.collab.science.gc.ca:5671//'}, 'local_offset': 0, 'subscription_index': 0}
2025-05-14 12:49:51,187 [INFO] sarracenia getContent retrieving from: https://hpfx.collab.science.gc.ca//20250514/WXO-DD/observations/swob-ml/20250514/CWGX/2025-05-14-1649-CWGX-AUTO-minute-swob.xml
le premier 50 octets du fichier annoncé: b'<?xml version="1.0" encoding="UTF-8" standalone="n'
message 2: {'_format': 'v02', '_deleteOnPost': {'_format', 'subscription_index', 'local_offset', 'ack_id', 'subtopic', 'exchange', 'topic'}, 'sundew_extension': 'DMS:WXO_RENAMED_SWOB2:MSC:XML::20250514164936', 'from_cluster': 'DDSR.CMC', 'to_clusters': 'ALL', 'filename': 'msg_ddsr-WXO-DD_d8640d45868a8745a877ef233f09f21a:DMS:WXO_RENAMED_SWOB2:MSC:XML::20250514164936', 'mtime': '20250514T164938.264', 'atime': '20250514T164938.264', 'pubTime': '20250514T164938.264', 'baseUrl': 'https://hpfx.collab.science.gc.ca', 'relPath': '/20250514/WXO-DD/observations/swob-ml/20250514/CWGX/2025-05-14-1649-CWGX-AUTO-minute-swob.xml', 'subtopic': ['', '20250514', 'WXO-DD', 'observations', 'swob-ml', '20250514', 'CWGX', '2025-05-14-1649-CWGX-AUTO-minute-swob.xml'], 'identity': {'method': 'md5', 'value': '4I6zdE2BnD6HT1pqxlnJUQ=='}, 'size': 9409, 'exchange': 'xpublic', 'topic': 'v02.post.20250514.WXO-DD.observations.swob-ml.20250514.CWGX', 'ack_id': {'delivery_tag': 3, 'channel_id': 2, 'connection_id': '9559125c-2ebb-46e6-9ae6-3953c683a253_sub', 'broker': 'hpfx.collab.science.gc.ca:5671//'}, 'local_offset': 0, 'subscription_index': 0}
2025-05-14 12:49:51,723 [INFO] sarracenia getContent retrieving from: https://hpfx.collab.science.gc.ca//20250514/WXO-DD/observations/swob-ml/20250514/CWWZ/2025-05-14-1649-CWWZ-AUTO-minute-swob.xml
le premier 50 octets du fichier annoncé: b'<?xml version="1.0" encoding="UTF-8" standalone="n'
message 3: {'_format': 'v02', '_deleteOnPost': {'_format', 'subscription_index', 'local_offset', 'ack_id', 'subtopic', 'exchange', 'topic'}, 'sundew_extension': 'DMS:WXO_RENAMED_SWOB2:MSC:XML::20250514164936', 'from_cluster': 'DDSR.CMC', 'to_clusters': 'ALL', 'filename': 'msg_ddsr-WXO-DD_dc47b87bb82a20428771c3da3052ae04:DMS:WXO_RENAMED_SWOB2:MSC:XML::20250514164936', 'mtime': '20250514T164938.264', 'atime': '20250514T164938.264', 'pubTime': '20250514T164938.264', 'baseUrl': 'https://hpfx.collab.science.gc.ca', 'relPath': '/20250514/WXO-DD/observations/swob-ml/20250514/CWWZ/2025-05-14-1649-CWWZ-AUTO-minute-swob.xml', 'subtopic': ['', '20250514', 'WXO-DD', 'observations', 'swob-ml', '20250514', 'CWWZ', '2025-05-14-1649-CWWZ-AUTO-minute-swob.xml'], 'identity': {'method': 'md5', 'value': '7bTyPATk9dDCIHUVAW8rLQ=='}, 'size': 10422, 'exchange': 'xpublic', 'topic': 'v02.post.20250514.WXO-DD.observations.swob-ml.20250514.CWWZ', 'ack_id': {'delivery_tag': 4, 'channel_id': 2, 'connection_id': '9559125c-2ebb-46e6-9ae6-3953c683a253_sub', 'broker': 'hpfx.collab.science.gc.ca:5671//'}, 'local_offset': 0, 'subscription_index': 0}
2025-05-14 12:49:51,991 [INFO] sarracenia getContent retrieving from: https://hpfx.collab.science.gc.ca//20250514/WXO-DD/observations/swob-ml/20250514/CWSZ/2025-05-14-1646-CWSZ-AUTO-minute-swob.xml
le premier 50 octets du fichier annoncé: b'<?xml version="1.0" encoding="UTF-8" standalone="n'
message 4: {'_format': 'v02', '_deleteOnPost': {'_format', 'subscription_index', 'local_offset', 'ack_id', 'subtopic', 'exchange', 'topic'}, 'sundew_extension': 'DMS:WXO_RENAMED_SWOB2:MSC:XML::20250514164937', 'from_cluster': 'DDSR.CMC', 'to_clusters': 'ALL', 'filename': 'msg_ddsr-WXO-DD_050b3999a53cc7c0b4b3aa97c6814c23:DMS:WXO_RENAMED_SWOB2:MSC:XML::20250514164937', 'mtime': '20250514T164939.268', 'atime': '20250514T164939.268', 'pubTime': '20250514T164939.268', 'baseUrl': 'https://hpfx.collab.science.gc.ca', 'relPath': '/20250514/WXO-DD/observations/swob-ml/20250514/CWSZ/2025-05-14-1646-CWSZ-AUTO-minute-swob.xml', 'subtopic': ['', '20250514', 'WXO-DD', 'observations', 'swob-ml', '20250514', 'CWSZ', '2025-05-14-1646-CWSZ-AUTO-minute-swob.xml'], 'identity': {'method': 'md5', 'value': 'u9OOHp9YffDZ10rP6V0tvg=='}, 'size': 9683, 'exchange': 'xpublic', 'topic': 'v02.post.20250514.WXO-DD.observations.swob-ml.20250514.CWSZ', 'ack_id': {'delivery_tag': 5, 'channel_id': 2, 'connection_id': '9559125c-2ebb-46e6-9ae6-3953c683a253_sub', 'broker': 'hpfx.collab.science.gc.ca:5671//'}, 'local_offset': 0, 'subscription_index': 0}
2025-05-14 12:49:52,239 [INFO] sarracenia.moth.amqp getCleanUp deleting queue q_anonymous_idefix.local_SomethingHelpfulToYou
le premier 50 octets du fichier annoncé: b'<?xml version="1.0" encoding="UTF-8" standalone="n'
5 messages bien reçus
2ème exemple … combinez baseURL + relPath (en parlant de retPath) et récupérez les données … utilisez newMessages() au lieu de getNewMessage pour afficher une autre interface utilisateur de consommation. Parler de http, et comment la récupération variera en fonction du protocole répertorié dans la baseUrl, et peut être compliqué.
[3]:
import urllib.request
import xml.etree.ElementTree as ET
h = sarracenia.moth.Moth.subFactory(options)
count=0
while count < 10:
messages = h.newMessages() #get all received Messages, upto options['batch'] of them at a time.
for m in messages:
dataUrl = m['baseUrl']
if 'retPath' in m:
dataUrl += m['retPath']
else:
dataUrl += m['relPath']
print("url %d: %s" % (count,dataUrl) )
with urllib.request.urlopen( dataUrl ) as f:
vxml = f.read().decode('utf-8')
xmlData = ET.fromstring(vxml)
stn_name=''
tc_id=''
lat=''
lon=''
air_temp=''
for i in xmlData.iter():
name = i.get('name')
if name == 'stn_nam' :
stn_name= i.get('value')
elif name == 'tc_id' :
tc_id = i.get('value')
elif name == 'lat' :
lat = i.get('value')
elif name == 'long' :
lon = i.get('value')
elif name == 'air_temp' :
air_temp = i.get('value')
print( 'station: %s, tc_id: %s, lat: %s, long: %s, air_temp: %s' %
( stn_name, tc_id, lat, lon, air_temp ))
h.ack(m)
count += 1
if count > 10:
break
time.sleep(1)
h.cleanup() # remove server-side queue defined by Factory.
h.close()
print("obtained 10 product temperatures")
2025-05-14 12:50:02,029 [INFO] sarracenia.moth.amqp _queueDeclare queue declared q_anonymous_idefix.local_SomethingHelpfulToYou (as: amqps://anonymous@hpfx.collab.science.gc.ca), (messages waiting: 0)
2025-05-14 12:50:02,030 [INFO] sarracenia.moth.amqp getSetup binding q_anonymous_idefix.local_SomethingHelpfulToYou with v02.post.*.WXO-DD.observations.swob-ml.# to xpublic (as: amqps://anonymous@hpfx.collab.science.gc.ca)
url 0: https://hpfx.collab.science.gc.ca/20250514/WXO-DD/observations/swob-ml/20250514/CPIF/2025-05-14-1646-CPIF-AUTO-minute-swob.xml
station: ISLAND FALLS (AUT), tc_id: PIF, lat: 55.528161, long: -102.345178, air_temp: 6.9
url 1: https://hpfx.collab.science.gc.ca/20250514/WXO-DD/observations/swob-ml/20250514/CWGL/2025-05-14-1649-CWGL-AUTO-minute-swob.xml
station: LAGOON CITY, tc_id: WGL, lat: 44.548, long: -79.221, air_temp: 17.6
url 2: https://hpfx.collab.science.gc.ca/20250514/WXO-DD/observations/swob-ml/20250514/CWQP/2025-05-14-1649-CWQP-AUTO-minute-swob.xml
station: POINT PETRE (AUT), tc_id: WQP, lat: 43.8395, long: -77.1515, air_temp: 13.0
url 3: https://hpfx.collab.science.gc.ca/20250514/WXO-DD/observations/swob-ml/20250514/CVPX/2025-05-14-1649-CVPX-AUTO-minute-swob.xml
station: PRINCE GEORGE MASSEY AUTO, tc_id: VPX, lat: 53.90001, long: -122.790803, air_temp: 10.2
url 4: https://hpfx.collab.science.gc.ca/20250514/WXO-DD/observations/swob-ml/20250514/CXAT/2025-05-14-1649-CXAT-AUTO-minute-swob.xml
station: ARCTIC BAY CS, tc_id: XAT, lat: 72.99275, long: -85.011575, air_temp: -10.5
url 5: https://hpfx.collab.science.gc.ca/20250514/WXO-DD/observations/swob-ml/20250514/CWGY/2025-05-14-1649-CWGY-AUTO-minute-swob.xml
station: ESTHER 1, tc_id: WGY, lat: 51.6697, long: -110.2061, air_temp: 17.2
url 6: https://hpfx.collab.science.gc.ca/20250514/WXO-DD/observations/swob-ml/20250514/CWTG/2025-05-14-1639-CWTG-AUTO-minute-swob.xml
station: POINTE-DES-MONTS, tc_id: WTG, lat: 49.316667, long: -67.381165, air_temp: 9.1
url 7: https://hpfx.collab.science.gc.ca/20250514/WXO-DD/observations/swob-ml/20250514/CWTG/2025-05-14-1648-CWTG-AUTO-minute-swob.xml
station: POINTE-DES-MONTS, tc_id: WTG, lat: 49.316667, long: -67.381165, air_temp: 9.2
url 8: https://hpfx.collab.science.gc.ca/20250514/WXO-DD/observations/swob-ml/20250514/CWTG/2025-05-14-1649-CWTG-AUTO-minute-swob.xml
station: POINTE-DES-MONTS, tc_id: WTG, lat: 49.316667, long: -67.381165, air_temp: 9.0
url 9: https://hpfx.collab.science.gc.ca/20250514/WXO-DD/observations/swob-ml/20250514/CNZS/2025-05-14-1649-CNZS-AUTO-minute-swob.xml
station: CORAL HARBOUR RCS, tc_id: NZS, lat: 64.187831, long: -83.347054, air_temp: -7.7
url 10: https://hpfx.collab.science.gc.ca/20250514/WXO-DD/observations/swob-ml/20250514/CWIZ/2025-05-14-1649-CWIZ-AUTO-minute-swob.xml
station: L'ACADIE, tc_id: WIZ, lat: 45.293967, long: -73.349847, air_temp: 23.8
2025-05-14 12:50:08,161 [INFO] sarracenia.moth.amqp getCleanUp deleting queue q_anonymous_idefix.local_SomethingHelpfulToYou
obtained 10 product temperatures
Télécharger des données avec Python
Vous pouvez utiliser la bibliothèque python urllib pour télécharger des données, puis les analyser. Dans cet exemple, les données sont une structure XML par message téléchargé et lu en mémoire. Certaines données de station sont ensuite imprimées.
Cela fonctionne bien avec urllib pour les ressources de protocole de transport hyper-test, mais d’autres ressources peuvent être annoncées à l’aide d’autres protocoles, tels que sftp ou ftp. Le code python devra être étendu pour traiter avec d’autres protocoles, ainsi que des conditions d’erreur, telles que des pannes temporaires.
Conclusion
Sarracenia.moth.amqp est le moyen le plus léger d’ajouter la consommation de messages Sarracenia à votre pile python existante. Vous demandez explicitement de nouveaux messages lorsque vous êtes prêt à les utiliser.
Ce type d’intégration ne fournit pas:
data retrieval: vous avez besoin de votre propre code pour télécharger les données correspondantes,
error recovery: s’il y a des erreurs transitoires, vous devez créer un code de récupération d’erreur (pour récupérer des téléchargements partiels.)
async/event/data driven: une façon de dire “faites ceci chaque fois que vous obtenez un fichier” … définissez les rappels à exécuter lorsqu’un événement particulier se produit, plutôt que le flux séquentiel illustré ci-dessus.
La classe sarracenia.flow fournit des téléchargements, une récupération d’erreur et une API asynchrone à l’aide de la classe sarracenia.flowcb (flowCallback).
[ ]: