首先,我想说如果有人可以在这里提供帮助,您真是不可思议。
一般问题
我的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. …
Run Code Online (Sandbox Code Playgroud) 我有一个带netMsmqBinding的WCF服务.我的客户端可以将消息发送到我的队列,当服务运行时,它会按预期从队列中检索消息.如果服务未运行,则收到的消息将排队,直到服务启动.
我的问题是当邮件到达队列时服务没有启动.该服务托管在IIS中,因此在IIS收到请求之前不会对其进行实例化.如果我浏览到该服务,那么它会处理队列中的消息,但显然这不是我想要的处理队列的方法!
我希望我需要更改服务实现,或更改IIS设置,但我不知道改变的位置或内容.
UPDATE
有没有人真正使用MSMQ而不是WCF?我有这个工作很短的时间 - 我在同一台服务器上的另一个网站启用绑定,奇怪 - 但现在它已经不知何故再次停止工作.
我遇到的唯一问题是当队列中有消息时激活服务.目前,队列仅在实例化服务时进行处理,例如,当我浏览.svc文件时.我在应用程序上启用了net.msmq协议,并且我在网站上启用了net.msmq绑定...还有什么我需要做的吗?
我正在尝试开发一个WCF服务,它可以同时处理数百次下载和转换.我已经使用从ASP.NET Web应用程序接收消息的事务队列初始化了MSMQ.
经过长期的Internet研究后,我的问题是如何管理管理MSMQ消息的WCF服务方法中的长进程.
问题是,在小尺寸下载时,过程很快完成,并且范围返回完成到MSMQ服务,但如果下载大小很大并且需要下载3/4分钟,则范围返回仍然完成,但是MSMQ服务将MSG重新发送到WCF服务,我有重复的下载.
我想这是一个超时问题,但我已经尝试更好地配置我的主机app.config没有成功.
<netMsmqBinding>
<binding name="OrderServiceMsmqBinding"
maxRetryCycles="1"
receiveRetryCount="1"
retryCycleDelay="00:05:20"
deadLetterQueue="System"
receiveErrorHandling="Move"
exactlyOnce="true"
durable="true"
receiveTimeout="00:10:00"
sendTimeout="00:20:00"
timeToLive="1.00:00:00" useMsmqTracing="true">
<security mode="None"></security>
</binding>
</netMsmqBinding>
Run Code Online (Sandbox Code Playgroud)
这是WCF服务的方法:
<OperationBehavior(TransactionScopeRequired:=True, TransactionAutoComplete:=True)> _
Public Sub FfmpegConversion(ffmpegjob As FfmpegJob) Implements IOrderService.FfmpegConversion
Using sc As New TransactionScope(TransactionScopeOption.Required)
Try
ExecuteLongProcess()
Catch ex As Exception
Console.WriteLine(ex.Message)
Finally
sc.Complete()
End Try
End Using
End Sub
Run Code Online (Sandbox Code Playgroud)
UPDATE
经过长时间的试验和研究,我开始认为不可能对MSMQ队列触发的方法进行长时间的处理.
我使用管理数据的不同线程来解决它,但现在的问题是我失去了TransactionScope的优势,因为一旦作业传递给新线程,那么MSMQ就会认为已经完成了删除msg.
我有一个场景,大约需要将10条不同的消息排队,然后出列/处理.一个用户需要所有10个消息,而另一个用户只需要10个消息中的8个.我试图了解设置此类架构的最佳方法是什么.您是否为每种消息类型创建一个队列,以便订阅者可以只订阅相关队列,还是将它们全部转储到同一队列并忽略与该订阅者无关的消息?我想确保解决方案灵活/可扩展等.
处理:
一如既往地非常欣赏这些信息.
--S
我有一个自托管的 WCF 服务(在 Windows 服务中运行)。此服务侦听 MSMQ 上的消息。该服务是 PerCall 和 Transactional,在 Windows 2008 R2、.NET 4.0、MSMQ 5.0 上运行。
每两周一次,该服务将停止处理消息。Windows 服务保持运行,但 WCF 服务主机本身停止。servicehost 出现以下异常:
时间戳:2015 年 3 月 21 日下午 5:37:06 消息:HandlingInstanceID:a26ffd8b-d3b4-4b89-9055-4c376d586268 发生并捕获了“System.ServiceModel.MsmqException”类型的异常。-------------------------------------------------- ------------------------------- 03/21/2015 13:37:06 类型:System.ServiceModel.MsmqException,系统.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 消息:从队列接收消息时出错:事务的操作顺序不正确。(-1072824239, 0xc00e0051)。确保 MSMQ 已安装并正在运行。确保队列可用于接收。来源:System.ServiceModel 帮助链接:错误代码:-1072824239 数据:System.Collections.ListDictionaryInternal TargetSite:Boolean TryReceive(System.TimeSpan, System.
搜索特定异常(“事务的操作顺序不正确”)不会产生很多信息。大多数关于如何修复故障服务的建议是在故障事件中重新启动服务主机。
我可以这样做,但我希望此异常有一个已知的可修复原因和/或是否有更清晰的方法来处理它。
我们有一个解决方案,我们使用Windows服务选择消息.
Windows服务每隔2分钟触发一次并检索MSMQ消息以将其传递给Web服务.
我不是MSMQ或WCF的专家,我已经读了很多关于它的内容,听起来很棒.我正在努力开发一些东西,但最先是一些理论,它需要坚固耐用.
我想MSMQ将托管在一个单独的服务器上.
将有2个WCF服务.一个用于传入消息,另一个用于传出消息(接收消息,进行一些内部处理/验证,然后将其放在传出消息队列中,或者可能发送电子邮件/文本消息/等等)
我理解正确的配置,我们可以让系统成为事务性的(没有消息丢失)并且可以发送一次,因此没有重复消息的可能性.
应用程序/服务将是多线程的,以处理消息,其中将有数百个消息.
但是在处理消息期间或通过服务生命周期,如果服务器崩溃了怎么办?如果服务器重新启动怎么办?如果服务因任何原因抛出异常怎么办?怎么可能不丢失该消息,但有些如何将它放回队列等待它再次处理?另外,如何才能确保服务的稳健性能让它再次产生自身?
我很感激这里有任何建议和细节.有很多东西可以接受,WCF/MSMQ暴露了很多选项.