Para começar, eu gostaria de dizer que se alguém puder ajudar aqui, você é incrível.
Pergunta Geral
Meu programa Python precisa interagir com o MSMQ. Basicamente, quero espiar uma fila, especificando um tempo limite se não houver nada na fila.
No entanto, apesar dos meus melhores esforços, não consigo Peek () aguardar o intervalo de tempo limite, quando não há valor anteriormente na fila. Você pode apontar o que está faltando nesse código?
Meu Código Atual
Aqui está o meu código agora:
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
Eu corro: inspect.getfullargspec(queue.Peek)
e recebo:
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={})
Coisas que eu tentei
Esta pergunta : dizer ReceiveTimeout=timespan
não parece resolver o meu problema.
Substituir pythoncom.Empty
por pythoncom.Missing
não parece funcionar
Esta pergunta sem resposta parece muito semelhante à minha
CoWaitForMultipleHandles(Flags, Timeout , Handles )
isso ajuda você?queue.Peek
Respostas:
Encontrei este artigo enviando-msmq-messages-python
O artigo mostra como enviar e receber uma mensagem usando o msmq. Eu não entendo por que você não pode simplesmente sintaxe de conexão de soquete padrão para dizer se eu não recebi um pacote / conexão e fechei a conexão
Então, algo assim não deve ser muito difícil. No pior cenário, crie um encadeamento que verifique a cada timeout_time se uma variável é zero ou não. Se for zero, feche a fila, nada será recebido se for> 0 definido como zero e aguarde mais mensagens. Eu também encontrei um GitHub sobre msmq assíncrono para log em python. msmq assíncrono Este disse apenas receber enquanto True dlopes7 msmq
Não é a resposta que você queria, mas uma que funcione.
fonte
Nos comentários da pergunta original, @PeterBrittain sugeriu tentar apenas usar:
Eu tentei fazer isso e, na verdade, funcionou! Encontrei
float
valores para trabalhar também. Aqui está um exemplo de código Python:Obrigado @PeterBrittain!
fonte