【发布时间】:2012-03-19 21:27:38
【问题描述】:
我有一个外部程序,它将调用一个存储过程来等待队列上的消息,然后处理它。问题是有时从队列中读取的消息可能无法正确处理,当发生这种情况时,我希望将消息保留在队列中,直到可以处理为止。
看起来除非队列是通过指定 RETENTION 创建的,否则消息将始终在 WAITFOR 成功后从队列中删除,除非事务回滚。但是正如您所看到的,在存储过程将消息返回给调用者(即 java 程序)之前,我无法知道消息是否有效。我想知道是否可以将“开始事务”和“提交”或“回滚”中断为两个存储过程:首先调用开始事务和等待消息的存储过程;当它带着消息返回时,尝试在java代码中处理消息;如果消息处理成功,则调用第二个存储过程提交事务,或者调用另一个存储过程回滚并将消息放回队列.
我关心的是,如何指定正确的事务来提交或回滚,因为它们不是在同一个存储过程中调用的?
还有其他好的做法来处理这种情况吗?我还有一个替代的想法是创建一个异常队列,让java代码把失败的消息放到异常队列中。
任何 cmets 将不胜感激!
【问题讨论】: