您能否确保一次只有一个客户端连接到Oracle AQ?

您能否确保一次只有一个客户端连接到Oracle AQ?,oracle,jms,oracle-aq,Oracle,Jms,Oracle Aq,我们有一个Oracle AQ队列引发事件 我们有Java Oracle AQ客户端处理这些事件 出于灾难恢复目的,我们有另一个始终处于关闭状态的客户端。但我们也有过这样的案例,当DR训练让第二个客户继续工作时,我们损失了很多事件 是否有任何方法可以通过编程或使用配置来确保队列中只有订阅者。有多用户队列和单用户队列。单个使用者队列没有订阅服务器。如果有访问权限,任何客户端都可以使用。 但是,要解决您的问题,您只有很少的选择,以下是按易于实施的顺序排列的: 选项1:访问控制: Oracle支持在队列

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

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

出于灾难恢复目的,我们有另一个始终处于关闭状态的客户端。但我们也有过这样的案例,当DR训练让第二个客户继续工作时,我们损失了很多事件


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

有多用户队列和单用户队列。单个使用者队列没有订阅服务器。如果有访问权限,任何客户端都可以使用。 但是,要解决您的问题,您只有很少的选择,以下是按易于实施的顺序排列的:

选项1:访问控制: Oracle支持在队列级别对出列进行访问控制。因此,如果用户不同,您可以将此访问权限授予单个用户

->应用程序_A使用用户_A,并且只有用户_A被授予从队列_A消费的访问权

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

->DR和应用程序都订阅多消费者队列。每个消费者(DR、应用程序_A)都可以消费(每个仅一次)该消息-因为该消息未过期。一旦所有使用者都使用了该消息,则该消息将退出队列

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


->DR和应用程序A都有自己的队列来使用这些消息。(队列\ DR,队列\ A)。定义多消费者队列。QUEUE_MULTI传播到QUEUE_DR和QUEUE_A等。消息传播到所有队列后,消息将从QUEUE_MULTI中消耗,而不管相应队列QUEUE_A、QUEUE_DR中发生了什么。您可以确保两个应用程序使用相同的用户,并且该用户仅用于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;

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

阅读这个问题,不是关于限制会话,而是限制订阅者。此外,连接以接收队列消息的“客户端”不会一直连接,而是连接以检查和消费,或者在没有消息时睡眠。按照我阅读问题的方式,他们希望使用正常的单消费者队列,并希望确保一次只有一个客户端可以获取事件。他们确实希望两个客户端能够从同一队列中获取事件,但不能同时获取。当真正的客户端处于活动状态时,第二个客户端将无法连接,反之亦然。通过阅读这个问题,我的答案是有效的,前提是客户机在启动时连接并保持连接。问题中没有说他们不能那样做。我觉得这一票没有得到满足。如果你的阅读是正确的,chinto会选择你的答案。我真的认为允许一次会议来处理这个问题在这里不被考虑。通常,您可以有一个连接池连接到队列,同时连接多个连接-如果您有10个或100个连接会怎么样。。每秒的邮件数?!此外,假设一个连接一直连接是不现实的,并且是一个危险的考虑因素,因此是否决票