Per i principianti, vorrei dire che se qualcuno può aiutare qui, sei incredibile.
Domanda generale
Il mio programma Python deve interagire con MSMQ. Fondamentalmente, voglio sbirciare una coda, specificando un timeout se non c'è nulla nella coda.
Tuttavia, nonostante i miei migliori sforzi, non riesco a far attendere a Peek () l'intervallo di timeout, quando in precedenza non è presente alcun valore nella coda. Potete per favore sottolineare ciò che manca a questo codice?
Il mio codice attuale
Ecco il mio codice adesso:
from socket import gethostname
import win32com.client
import pythoncom
import clr
clr.AddReference("System")
clr.AddReference("System.Messaging")
from System import TimeSpan
from System.Messaging import MessageQueue
# Source: [1]
# [1] https://docs.microsoft.com/en-us/previous-versions/windows/desktop/msmq/ms707027%28v%3dvs.85%29
MQ_DENY_NONE = 0x0
MQ_PEEK_ACCESS = 0x1
MQ_SEND_ACCESS = 0x2
# Set up queue
pythoncom.CoInitialize()
qinfo = win32com.client.Dispatch("MSMQ.MSMQQueueInfo")
qinfo.FormatName = f"direct=os:{gethostname()}\\PRIVATE$\\MyQueue"
queue = qinfo.Open(MQ_PEEK_ACCESS, MQ_DENY_NONE)
# Receive a value
timeout_sec = 1.0
timespan = TimeSpan.FromSeconds(timeout_sec)
label, body = "", ""
# TODO: timeout value does not appear working. It never waits when
# there's no message
if queue.Peek(pythoncom.Empty, pythoncom.Empty, timespan):
msg = queue.Receive() . # Blocking receive --> remove msg from the queue
if msg is not None:
label = msg.Label
body = msg.Body
Corro: inspect.getfullargspec(queue.Peek)
e ottengo:
FullArgSpec(args=['self', 'WantDestinationQueue', 'WantBody', 'ReceiveTimeout', 'WantConnectorType'], varargs=None, varkw=None, defaults=(<PyOleMissing object at 0x00000147F5D43BD0>, <PyOleMissing object at 0x00000147F5D43BD0>, <PyOleMissing object at 0x00000147F5D43BD0>, <PyOleMissing object at 0x00000147F5D43BD0>), kwonlyargs=[], kwonlydefaults=None, annotations={})
Cose che ho provato
Questa domanda : dire ReceiveTimeout=timespan
non sembra risolvere il mio problema.
La sostituzione pythoncom.Empty
con pythoncom.Missing
non sembra funzionare
Questa domanda senza risposta sembra molto simile alla mia
queue.Peek
CoWaitForMultipleHandles(Flags, Timeout , Handles )
ti aiuta?