สำหรับผู้เริ่มฉันอยากจะบอกว่าถ้าใครสามารถช่วยได้ที่นี่คุณก็เหลือเชื่อ
คำถามทั่วไป
โปรแกรม 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
ดูเหมือนจะไม่ทำงาน
คำถามที่ไม่มีคำตอบนี้ดูเหมือนว่าจะคล้ายกับฉันมาก
queue.Peek
CoWaitForMultipleHandles(Flags, Timeout , Handles )
ช่วยคุณได้ไหม?