在BizTalk MSMQ适配器中使用FullReceive Acknowledgement类型

3
我通过MSMQ适配器从BizTalk向MSMQ队列发送消息。
我需要确认消息已被完全接收(由接收方从队列中接收)。无论我在MSMQ传输属性中发送何种确认类型,都无法实现该功能。
我知道完全接收确认取决于消息的TTL(生存时间)。但是这不能在MSMQ传输属性中设置。只有超时,但它仅适用于到达队列(这是MSDN关于超时的说明:“指定等待消息到达目标队列的最长时间。仅当使用事务时才适用。”)。我将此超时属性设置为10秒。
如果我将Ack类型设置为FullReceive,则仅在从队列中提取消息时才会收到确认。但是我从未收到过NACK(显然是因为TTL尚未到期)。我认为默认的TTL为4小时。我还使用了其他的Ack类型,如NegativeReceive等,但如果消息未从队列中提取,就没有给我NACK。
我可以通过WCF-NetMSMQ适配器实现这一点,其中您可以发送TTL值,并在其过期时获得NACK。
有人知道如何通过MSMQ适配器使FullReceive正常工作,并在10秒内未从队列中接收到消息时收到NACK吗?

超时是MSMQ适配器中与TTL相对应的概念。超时单位是否设置正确? - Johns-305
不,超时并不像TTL一样工作,它是用于到达队列的。我测试过很多次。而且MSDN也证实了这一点。它关于超时的说明是:“指定等待消息到达目标队列的最长时间。仅适用于使用事务时。” - user3778421
1个回答

1
您可以设置任何可在 MSMQT Adapter上使用的属性,其中一些属性无法通过BizTalk管理中的适配器配置进行设置。要这样做,您需要创建一个自定义管道组件,然后在AddDocument() IAssemblerComponent实现内直接提升正确的属性:
// Promote msmq response queue property
private void PromoteProperty(MessageContextPropertyBase property, IBaseMessageContext context, object val)
{
    context.Promote(property.Name.Name, property.Name.Namespace, val);
}

this.PromoteProperty(new MSMQT.AnyProperty, message.Context, "Value"); 

谢谢您的回答,但它不能满足我的需求。首先,在BTS 2013中,MSMQT有些过时了。其次,这个适配器仍然没有任何属性来指定消息在目标队列中停留的超时时间。 - user3778421
抱歉,我只使用过2009年之前的BTS。 - tom redfern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接