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.
CoWaitForMultipleHandles(Flags, Timeout , Handles )
¿te ayuda?queue.Peek
Respuestas:
Encontré este artículo enviando-msmq-messages-python
El artículo muestra cómo enviar y recibir un mensaje usando msmq. No entiendo por qué no puede simplemente sintaxis de conexión de socket estándar para decir si no he recibido un paquete / conexión y luego cerrar la conexión
Entonces, algo así no debería ser demasiado difícil. En el peor de los casos, cree un hilo que verifique cada timeout_time si una variable es cero o no. Si es cero, no se recibe nada si es> 0 establecido en cero y espera más mensajes. También encontré un GitHub sobre msmq asíncrono para el registro de python. msmq asíncrono Éste acaba de decir recibir mientras verdadero dlopes7 msmq
No es la respuesta que quería, sino una que funcionará.
fuente
En los comentarios de la pregunta original, @PeterBrittain sugirió probar simplemente usando:
Tuve la oportunidad de probar eso, y en realidad, ¡funcionó! Encontré
float
valores para trabajar también. Aquí hay un código de Python de muestra:¡Gracias @PeterBrittain!
fuente