【问题标题】:Service Broker : keep messages that could not be handled by an external program in the queueService Broker:将外部程序无法处理的消息保留在队列中
【发布时间】:2012-03-19 21:27:38
【问题描述】:

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

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

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

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

任何 cmets 将不胜感激!

【问题讨论】:

    标签: sql-server service-broker


    【解决方案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 External Activator”) 您也可以制作类似 .net 中已经制作的东西 (ServiceBrokerInterface)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多