如何延迟从WCF端点上的MSMQ中选择消息

时间:2013-06-08 07:41:24

标签: wcf msmq

任何人都可以建议我一个解决方案,我希望在一段时间之后拾取队列中的msmq消息,因为在我获取msmq消息进行处理之前需要在数据库中触发工作流,而我是在工作流程处理中看到一些延迟。是否有一些设置或内置功能作为睡眠,并且所有这些都不是我正在寻找的解决方案或者在客户端延迟,因为在客户端上运行的事务需要一次性执行并且不能延迟进程只是打电话给队列。

谢谢, 巴拉

1 个答案:

答案 0 :(得分:0)

我通过创建另一个队列作为Pending队列来解决这个问题。一旦我在端点收到消息,我就使用下面的队列将不需要立即处理的相应消息排队到另一个队列。

PendingQueue.Send(queuedMessage);

邮件已自动在活动队列中删除。

还有另一个Timer服务解析此Pending队列,并在需要时将消息重新排入队列。

但是,请记住在计时器中初始化队列时将自定义xmlformatter添加到挂起队列,如下面的队列,因为队列将不知道如何反序列化合同对象。

//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)
}

上面为我做了诀窍。还要记住,活动队列不应该是事务性的,否则,如果重新排队时消息执行失败,则无法通知原始调用者。 请随时改进解决方案。