Für den Anfang möchte ich sagen, wenn jemand hier helfen kann, sind Sie unglaublich.
Allgemeine Frage
Mein Python-Programm muss mit MSMQ interagieren. Grundsätzlich möchte ich einen Blick auf eine Warteschlange werfen und eine Zeitüberschreitung angeben, wenn sich nichts in der Warteschlange befindet.
Trotz meiner Bemühungen kann ich Peek () nicht dazu bringen, das Timeout-Intervall abzuwarten, wenn sich zuvor kein Wert in der Warteschlange befindet. Können Sie bitte darauf hinweisen, was in diesem Code fehlt?
Mein aktueller Code
Hier ist mein Code im Moment:
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
Ich renne: inspect.getfullargspec(queue.Peek)
und bekomme:
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={})
Dinge, die ich versucht habe
Diese Frage : Sprichwort ReceiveTimeout=timespan
scheint mein Problem nicht zu lösen.
Das Ersetzen pythoncom.Empty
durch pythoncom.Missing
scheint nicht zu funktionieren
Diese unbeantwortete Frage scheint meiner sehr ähnlich zu sein
queue.Peek
CoWaitForMultipleHandles(Flags, Timeout , Handles )
es hilft Ihnen?