有没有人能给我一个解决方案,我希望队列中的msmq消息在一些延迟后被拾取,因为在我拾取msmq消息进行处理之前需要在数据库中触发工作流,并且我在工作流处理中看到一些延迟。是否有一些设置或内置功能作为睡眠,所有这些都不是我正在寻找的解决方案,或者在客户端延迟,因为在客户端上运行的事务需要一次执行,并且不能延迟对队列的调用。
谢谢,巴拉
我通过创建另一个队列作为Pending queue来解决这个问题。在端点接收到消息后,我使用下面的队列将不需要立即处理的适当消息排队到另一个队列。
PendingQueue.Send(queuedMessage);
消息自动从活动队列中删除。
有另一个Timer服务解析这个Pending队列,并在需要时将消息重新排队为活动。
但是,请记住在timer中初始化队列时将自定义xmlformatter添加到挂起队列中,如下面的queue中所示,因为队列将不知道如何反序列化契约对象。
//Create a Formatter that can deserialize the Messages.
XmlMessageFormatter xmlMessageFormatter = new XmlMessageFormatter
{
TargetTypes = new[]
{typeof (DataContract)}
};
_pendingQueue.Formatter = xmlMessageFormatter;
然后使用以下代码在适当的时间检索对象。
List<Message> messages = PendingQueue.GetAllMessages().ToList();
foreach (Message x in messages)
{
DataContract y = x.Body as DataContract;
if (!<some condition>)
continue;
//Remove the object from pending queue.
PendingQueue.ReceiveById(x.Id);
_mproxy.QueueMessage(y)
}
上面的对我起了作用。另外请记住,活动队列不应该是事务性的,否则,如果在重新排队时消息执行失败,则无法通知原始调用方。请随意改进解决方案。