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
CoWaitForMultipleHandles(Flags, Timeout , Handles )
es hilft Ihnen?queue.Peek
Antworten:
Ich habe diesen Artikel gefunden , der-msmq-messages-python sendet
Der Artikel zeigt Ihnen, wie Sie mit msmq eine Nachricht senden und empfangen. Ich verstehe nicht, warum Sie nicht einfach die Standard-Socket-Verbindungssyntax verwenden können, um zu sagen, wenn ich kein Paket / keine Verbindung erhalten habe, schließen Sie die Verbindung
So etwas sollte also nicht zu schwierig sein. Im schlimmsten Fall wird ein Thread erstellt, der jedes Mal überprüft, ob eine Variable Null ist oder nicht. Wenn die Warteschlange Null ist, wird nichts empfangen, wenn> 0 auf Null gesetzt ist, und auf weitere Nachrichten warten. Ich habe auch einen GitHub über asynchrones msmq für die Python-Protokollierung gefunden. asynchrones msmq Dieser hat gerade gesagt, dass er empfangen wird, während True dlopes7 msmq
Nicht die Antwort, die Sie wollten, aber eine, die funktionieren wird.
quelle
In den Kommentaren der ursprünglichen Frage schlug @PeterBrittain vor, nur Folgendes zu verwenden:
Ich habe das ausprobiert und tatsächlich hat es funktioniert! Ich fand auch
float
Werte, die funktionieren. Hier ist ein Beispiel für einen Python-Code:Vielen Dank, dass Sie @PeterBrittain!
quelle