将MSMQ消息从一个队列路由到另一个队列

时间:2012-01-09 21:23:35

标签: msmq biztalk

是否有一些标准配置设置,服务或工具接受来自一个队列的消息并将其移至另一个队列?自动处理死信息问题,并提供一些重试功能?我当时认为这是“MSMQ消息路由”所做的,但似乎无法在其上找到文档(Windows Mobile 6除外,我不知道这是否相关)。

上下文:

据我所知,在使用MSMQ时,您应始终写入本地队列,以免发生故障,然后X应将该消息移至远程队列。我的理解错了吗?这是Biztalk等消息传递基础设施的用武之地吗?是否没有必要首先写入本地队列以绝对确保成功?我应该自己建立X吗?

2 个答案:

答案 0 :(得分:5)

正如休指出的那样,只需要一个MSMQ队列就可以从一个源向目的地的一个方向发送消息。源和目标可以位于同一服务器,同一网络或Internet上,但源和目标都必须运行MSMQ服务。

如果您需要执行“消息”路由(例如,处理来自多个源或目标队列的消息的交换机,或根据消息类型将消息路由到一个或多个订户等),您将需要的不仅仅是MSMQ队列。 虽然您当然可以使用BizTalk进行邮件路由,但如果您不需要使用BizTalk的其他功能,这将是昂贵/过度的。建议您查看开源,或自己构建自定义内容。

但是,当使用HTTP作为传输时,您可能会引用队列重定向功能。通过互联网(例如herehere)。

Re:发送失败并重试

我认为你有大多数概念 - 通常消息DELIVERY重试功能应该隐含在MSMQ中。如果MSMQ在定义的到期之前无法传递消息,那么它将在死信队列中返回,然后源可以处理来自DLQ的消息然后“补偿”它们(例如,反转'发送'的动作,表示用户失败等。)

然而,目标应用程序/侦听器需要执行“处理”类型目标中的重试(例如,如果目标系统已关闭,死锁等)

执行此操作的常用方法包括:

  • 使用2阶段提交 - 在分布式工作单元下,将消息从MSMQ中拉出并处理它(例如将数据插入数据库,更改某些记录的状态等),如果遇到任何故障,则保留消息返回队列,数据库更改将被回滚。
  • 应用程序级别重试 - 即在目标系统上,在“可重试”类型错误(由于加载,死锁等引起的超时)的情况下,然后休眠几秒钟,然后重试相同的事务。

但是,在大多数情况下,无法进行无限期处理重试,您最终需要承认失败并实施一种机制来记录消息和错误并将其从队列中删除。

但是我不会'重试'业务失败(例如业务规则,验证等),并且应该在您对如何处理这些问题的要求中定义行为(例如,帐户透支,消息格式不正确有效等),例如通过将“NACK”类型的消息返回给源。

HTH

答案 1 :(得分:3)

MSMQ将消息从一个队列发送到另一个队列。

假设您在远程计算机上有一个队列。您想要将消息发送到该队列。

所以你创建一个发件人。发件人是可以使用MSMQ传输发送消息的应用程序。这可以是.Net队列客户端(System.Messaging),WCF服务使用者(通过netMsmqBinding或msmqIntegrationBinding,使用MSMQ适配器的BizTalk等等。

发送消息时,实际发生的是:

  1. 发件人计算机上的MSMQ队列管理器将邮件写入临时本地队列。
  2. 发件人计算机上的MSMQ队列管理器连接到接收计算机上的MSMQ管理器并发送消息。
  3. 接收方计算机上的MSMQ队列管理器将消息放入目标队列。
  4. 在某些情况下,MSMQ将遇到由于某种原因无法在目标队列上接收的消息。在这些情况下,如果您已指示消息将使用死信队列,则MSMQ将确保将消息转发到死信队列。