Để bắt đầu, tôi muốn nói nếu có ai có thể giúp đỡ ở đây, bạn thật không thể tin được.
Câu hỏi chung
Chương trình Python của tôi cần tương tác với MSMQ. Về cơ bản, tôi muốn nhìn trộm hàng đợi, chỉ định thời gian chờ nếu không có gì trong hàng đợi.
Tuy nhiên, bất chấp những nỗ lực tốt nhất của tôi, tôi không thể khiến Peek () chờ đợi khoảng thời gian chờ, khi không có giá trị nào trước đó trong hàng đợi. Bạn có thể vui lòng chỉ ra những gì còn thiếu từ mã này?
Mã hiện tại của tôi
Đây là mã của tôi ngay bây giờ:
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
Tôi chạy: inspect.getfullargspec(queue.Peek)
và nhận:
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={})
Những điều tôi đã thử
Câu hỏi này : nói ReceiveTimeout=timespan
dường như không giải quyết được vấn đề của tôi.
Thay thế pythoncom.Empty
bằng pythoncom.Missing
dường như không hoạt động
Câu hỏi chưa được trả lời này có vẻ rất giống với tôi
queue.Peek
CoWaitForMultipleHandles(Flags, Timeout , Handles )
giúp gì cho bạn không?