Service Broker:保留队列中外部程序无法处理的消息

时间:2012-03-19 11:40:04

标签: sql-server service-broker

我有一个外部程序,它会调用存储过程来等待队列中的消息,然后对其进行处理。问题是有时从队列中读取的消息可能无法正确处理,当它发生时,我希望保留消息保留在队列中,直到可以处理它。

除非通过指定RETENTION创建队列,否则除非事务被回滚,否则将在成功的WAITFOR时始终从队列中删除消息。但正如您所看到的,在存储过程将消息返回给调用者(即java程序)之前,我将无法知道消息是否有效。我想知道是否有可能打破“开始事务”和“提交”或“回滚”到两个存储过程:调用存储过程开始事务并先等待消息;当它与消息一起返回时,尝试处理java代码中的消息;如果消息处理成功,则调用第二个存储过程来提交事务,或者调用另一个存储过程来回滚它并将消息放回队列

我担心的是,如何指定正确的事务来提交或回滚,因为它们不是在同一个存储过程中调用的?

还有其他好的做法来处理这种情况吗?我还有另一个想法是创建一个异常队列,让java代码将失败的消息放到异常队列中。

任何评论都将不胜感激!

1 个答案:

答案 0 :(得分:1)

您不会调用存储过程来等待消息,而只是查询队列。

WAITFOR (RECEIVE conversation_handle,message_type_name,service_contract_name,convert(xml, message_body) FROM [dbo].[MyQueue])

当新消息到达时,保持事务处理打开,处理消息 - 如果消息有意外错误,则回滚事务。如果预期错误结束会话有错误。

实际上我认为好主意是使用外部激活器(msdn,下载名称:“Microsoft SQL Server 2008 R2 Service Broker外部激活器”) 您也可以制作类似于.net(ServiceBrokerInterface

中的内容