2012-06-29 46 views
1

我们有一些代码,看起来有点像这个(错误处理和其他的东西去掉)应该ServiceBroker对话是一个交易

using (var tran = conn.BeginTransaction()) 
{ 
    var client = new Service(...); 
    var dialog = client.GetConversation(null, conn, tran); 
    var response = dialog.Receive(); 

    // do stuff with response, including database work 

    dialog.Send(message, conn, tran); 
    dialog.EndConversation(conn, tran); 

    tran.Commit(); 
    conn.Close(); 
} 

里面我们已经继承了这个代码,并没有在ServiceBroker专家,将如果我们将交谈移到交易之外,就会出现问题:

var client = new Service(...); 
var dialog = client.GetConversation(null, conn, tran); 
var response = dialog.Receive(); 

using (var tran = conn.BeginTransaction()) 
{ 
    // do stuff with response, including database work 
    tran.Commit(); 
} 

dialog.Send(message, conn, tran); 
dialog.EndConversation(conn, tran); 
conn.Close(); 
+0

刚刚将conn.Close()移至底部 – Argos

回答

1

在这种情况下,您会收到消息并将其从队列中移除。您将无法再次收到它。

如果所有代码都处于事务中,并且消息处理中存在错误 - 事务将永不提交,并且消息保持在队列中(默认情况下,在5个回滚队列被禁用后)。所以你可以检测错误的原因,纠正错误并再次处理消息(预期的异常不应该导致回滚,有很多方法可以处理它们)。

我会说一切都应该在交易中。

+0

@Janis - 在我们的情况下,我们不需要再次接收消息。事实上,如果出现错误,我们不希望邮件被放回,因为它失败了5次,导致队列失效。我们想在第二个例子的事务中记录和处理代码中的错误。这会工作吗? – Argos

+0

是的,它应该工作,如果你真的想要什么。所以也许好主意可以被保留在队列中。因此,如果两端没有“结束对话”,则消息保持在队列中但处于其他状态。 –

相关问题