15
15
import time
16
16
from datetime import datetime
17
17
from functools import partial
18
+ from typing import Literal
18
19
19
20
import workflows
20
21
@@ -66,9 +67,11 @@ def run() -> None:
66
67
transport = workflows .transport .lookup (args .transport )()
67
68
68
69
characterfilter = re .compile (r"[^a-zA-Z0-9._-]+" , re .UNICODE )
69
- idlequeue : queue .Queue = queue .Queue ()
70
+ idlequeue : queue .Queue [ Literal [ "start" , "done" ] | tuple [ str , str ]] = queue .Queue ()
70
71
71
- def receive_dlq_message (header : dict , message : dict , rabbitmq = False ) -> None :
72
+ def receive_dlq_message (
73
+ header : dict , message : dict , * , queue_name : str , rabbitmq = False
74
+ ) -> None :
72
75
idlequeue .put_nowait ("start" )
73
76
if rabbitmq :
74
77
msg_time = int (datetime .timestamp (header ["x-death" ][0 ]["time" ])) * 1000
@@ -99,8 +102,11 @@ def receive_dlq_message(header: dict, message: dict, rabbitmq=False) -> None:
99
102
100
103
with filename .open ("w" ) as fh :
101
104
json .dump (dlqmsg , fh , indent = 2 , sort_keys = True )
102
- print (
103
- f"Message { header ['message-id' ]} ({ time .strftime ('%Y-%m-%d %H:%M:%S' , timestamp )} ) exported:\n { filename } "
105
+ idlequeue .put_nowait (
106
+ (
107
+ queue_name ,
108
+ f" Message { header ['message-id' ]} ({ time .strftime ('%Y-%m-%d %H:%M:%S' , timestamp )} ) exported:\n { filename } " ,
109
+ )
104
110
)
105
111
transport .ack (header )
106
112
idlequeue .put_nowait ("done" )
@@ -112,17 +118,32 @@ def receive_dlq_message(header: dict, message: dict, rabbitmq=False) -> None:
112
118
elif args .transport == "PikaTransport" :
113
119
rmq = RabbitMQAPI .from_zocalo_configuration (zc )
114
120
queues = [q .name for q in rmq .queues () if q .name .startswith ("dlq." )]
121
+ print (f"Looking for DLQ messages in { len (queues )} queues..." )
115
122
for queue_ in queues :
116
- print ("Looking for DLQ messages in " + queue_ )
117
123
transport .subscribe (
118
124
queue_ ,
119
- partial (receive_dlq_message , rabbitmq = args .transport == "PikaTransport" ),
125
+ partial (
126
+ receive_dlq_message ,
127
+ rabbitmq = args .transport == "PikaTransport" ,
128
+ queue_name = queue_ ,
129
+ ),
120
130
acknowledgement = True ,
121
131
)
132
+ messages : dict [str , list [str ]] = {}
122
133
try :
123
134
idlequeue .get (True , args .wait or 3 )
124
135
while True :
125
- idlequeue .get (True , args .wait or 0.1 )
136
+ result = idlequeue .get (True , args .wait or 0.1 )
137
+ if isinstance (result , tuple ):
138
+ queuename , message = result
139
+ messages .setdefault (queuename , []).append (message )
140
+
126
141
except queue .Empty :
142
+ # Print out what we found, per queue
143
+ for queuename , q_messages in messages .items ():
144
+ print (f"Found { len (q_messages )} DLQ messages in { queuename } " )
145
+ for message in q_messages :
146
+ print (message )
147
+
127
148
print ("Done." )
128
149
transport .disconnect ()
0 commit comments