Для начала я хотел бы сказать, что если кто-то может помочь здесь, вы невероятны.
Общий вопрос
Моя программа на Python должна взаимодействовать с MSMQ. По сути, я хочу заглянуть в очередь, указав время ожидания, если в очереди ничего нет.
Однако, несмотря на все мои усилия, я не могу заставить Peek () переждать интервал ожидания, когда в очереди ранее не было значения. Можете ли вы указать, что отсутствует в этом коде?
Мой текущий код
Вот мой код прямо сейчас:
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
Я бегу inspect.getfullargspec(queue.Peek)
и получаю:
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={})
Вещи, которые я пробовал
Этот вопрос : поговорка ReceiveTimeout=timespan
не решает мою проблему.
Замена pythoncom.Empty
на pythoncom.Missing
не похоже на работу
Этот оставшийся без ответа вопрос кажется очень похожим на мой
CoWaitForMultipleHandles(Flags, Timeout , Handles )
это помогает вам?queue.Peek
Ответы:
Я нашел эту статью посылку-msmq-messages-python
В статье показано, как отправить и получить сообщение с помощью msmq. Я не понимаю, почему вы не можете просто использовать стандартный синтаксис сокетного соединения, чтобы сказать, что если я не получил пакет / соединение, то закройте соединение
Так что нечто подобное не должно быть слишком сложным. В худшем случае создайте поток, который каждый раз проверяет timeout_time, равна ли переменная нулю или нет. Если это ноль, закрыть очередь ничего не получено, если> 0, установить в ноль и ждать больше сообщений. Я также нашел GitHub об асинхронном msmq для регистрации в python. Асинхронный MSMQ Этот только что сказал получить в то время как True dlopes7 MSMQ
Не тот ответ, который вы хотели, а тот, который сработает.
источник
В комментариях к исходному вопросу @PeterBrittain предложил попробовать просто использовать:
Я нашел время, чтобы попробовать это, и на самом деле, это сработало! Я нашел
float
ценности для работы, а также. Вот пример кода Python:Спасибо @PeterBrittain!
источник