Para empezar, me gustaría decir que si alguien puede ayudar aquí, eres increíble.
Pregunta general
Mi programa Python necesita interactuar con MSMQ. Básicamente, quiero echar un vistazo a una cola, especificando un tiempo de espera si no hay nada en la cola.
Sin embargo, a pesar de mis mejores esfuerzos, no puedo hacer que Peek () espere el intervalo de tiempo de espera, cuando no hay ningún valor previamente en la cola. ¿Puedes señalar lo que falta en este código?
Mi código actual
Aquí está mi código en este momento:
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)
y obtengo:
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={})
Cosas que he probado
Esta pregunta : decir ReceiveTimeout=timespan
no parece resolver mi problema.
Reemplazar pythoncom.Empty
con pythoncom.Missing
no parece funcionar
Esta pregunta sin respuesta parece muy similar a la mía.
queue.Peek
CoWaitForMultipleHandles(Flags, Timeout , Handles )
¿te ayuda?