3

我们有一个 Oracle AQ 队列引发事件。

我们有 Java Oracle AQ 客户端处理这些事件。

出于灾难恢复的目的,我们有另一个客户端始终处于关闭状态。但是,当 DR 练习让第二个客户端继续运行时,我们遇到了一些案例,这使我们损失了事件。

是否有任何方式以编程方式或使用配置来确保队列中只有订阅者。

4

2 回答 2

1

有多消费者队列和单消费者队列。单个消费者队列没有订阅者。如果有权访问,任何客户端都可以使用。但是,解决您的问题,您几乎没有选择,按照易于实施的顺序排列如下:

选项 1:访问控制:

Oracle 支持队列级别的出列访问控制。因此,如果用户不同,您可以将此访问权限授予单个用户

-> Application_A 使用 USER_A,只有 USER_A 有权从 QUEUE_A 消费

选项 2:使用多消费者队列:

如果您将队列配置为多消费者,并且有消费者订阅(您使用队列的任何应用程序的多订阅者)。在所有订阅者都将其出列之前,不会从队列中消费该消息。因此,对于给定的消费者,消息不会丢失。您可以验证此发布-订阅模型的变体,哪种更合适,但一般来说,一条消息仍会在队列中,直到所有订阅者都使用它或它超时(您也可以控制它)

-> DR 和 Application_A 都订阅多消费者队列 QUEUE_MULTI。每个消费者(DR,Application_A)都可以使用(每个仅一次)消息 - 因为消息没有过期。一旦所有消费者都消费了该消息,该消息就会出队

选项 3:使用队列传播:

定义一个多消费者队列以传播到另一个队列,只有一个队列可以从该队列中出列。因此,接收到的消息会传播到其他队列(可以远程使用 DR 或其他应用程序的其他用途)。消息传播到队列,并在到达后标记为该队列已使用。直到所有消费者(包括其他队列)都消费完该消息后才完全消费该消息

-> DR 和 Application_A 都有自己的队列来消费这些消息。(QUEUE_DR,QUEUE_A)。定义一个多消费者队列QUEUE_MULTI。QUEUE_MULTI 传播到 QUEUE_DR 和 QUEUE_A 等。一旦消息传播到所有队列,无论在各个队列 QUEUE_A、QUEUE_DR 中发生了什么,消息都会从 QUEUE_MULTI 消费

于 2017-09-23T09:42:59.570 回答
0

您可以确保两个应用程序使用相同的用户,并且该用户仅用于 AQ(即不用于其他任务)。这样,您可以将用户限制为单个会话。如果一个应用程序已登录,另一个应用程序将无法连接:

alter system set resource_limit=true scope=both;
create profile only_one_session_profile limit sessions_per_user 1;
alter user (your user) profile only_one_session_profile;

我还没有测试过代码,但它应该可以工作。但是,不确定您的应用程序在只允许单个连接时如何反应!

于 2017-09-26T10:44:15.460 回答