如何延迟从WCF端点上的MSMQ提取消息



有没有人能给我一个解决方案,我希望队列中的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)
}
上面的

对我起了作用。另外请记住,活动队列不应该是事务性的,否则,如果在重新排队时消息执行失败,则无法通知原始调用方。请随意改进解决方案。

最新更新