0

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

谢谢,巴拉

4

1 回答 1

0

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

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

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

于 2013-09-11T13:02:45.330 回答