带有 ODP.Net 的 Oracle AQ。连接时自动出队

Bob*_*Bob 1 oracle odp.net oracle-aq

我使用 Oracle ODP.Net 进行入队和出队。

进程 A:入队进程 B:出队与 MessageAvailable 事件

如果进程 A 和 B 正在运行,则没有问题。在“进程 B”上,事件总是被触发。

但是,如果“进程 B”关闭而“进程 A”打开,则当“进程 B”重新启动时,在关闭时间内插入的队列将丢失。

是否可以选择为过去插入的所有队列触发事件?

非常感谢

小智 5

似乎有两种方法可以解决这个问题:

  1. 调用 OracleAQQueue 类的 Listen() 方法(在注册消息通知后)以获取位于队列中的“孤立”消息。请注意,Listen() 会阻塞,直到收到消息或发生超时。因此,您需要指定一个(短)超时以在队列中没有消息的情况下返回处理线程。
  2. 调用 Dequeue() 方法并捕获 Oracle 错误 25228(没有可用于出队的消息)。请参阅 Oracle 支持论坛中的以下主题:https : //forums.oracle.com/forums/thread.jspa?threadID=2186496

我一直在摸索这个话题。如果您仍然必须“手动”测试新消息,那么首先使用 MessageAvaiable 事件回调有什么好处?我考虑过的一种方法是将 Listen() 方法包装在异步调用中,以便调用者不会在线程上阻塞(直到收到消息或发生超时)。我在自定义的 Receive() 方法中包装了 Listen() 和 Dequeue() 并创建了我自己的 MessageReceived 事件处理程序以将消息详细信息传递给调用线程。似乎有些多余,因为 ODP.NET 提供了开箱即用的回调,但我不必处理您描述的问题(或编写代码以“手动”测试“孤立”消息。

欢迎对方法提出任何意见/想法。