我们有一个Oracle AQ队列引发事件。
我们有Java Oracle AQ客户端处理这些事件。
对于DR目的,我们有另一个客户端,它总是关闭。但是我们遇到了DR练习让第二个客户离开的情况,这导致我们失去了事件。
是否有任何方式以编程方式或使用配置来确保只有队列的订阅者。
答案 0 :(得分:1)
有多个消费者队列和单个消费者队列。单个使用者队列没有订阅者。如果有权访问,任何客户端都可以使用。 但是,解决您的问题,您没有多少选择,这些是按照易于实施的顺序进行的:
Oracle支持访问控制以在队列级别出列。因此,如果用户不同,您可以将此访问权限授予单个用户
- > Application_A使用USER_A,只有USER_A可以访问QUEUE_A
如果您将队列配置为多用户,并且具有消费者订阅(对于您使用该队列的任何应用程序的多用户)。在所有订户都将其出列之前,不会从队列中消耗该消息。因此,对于给定的消费者而言,不会丢失消息。这个发布 - 订阅模型的变体你可以验证哪个更合适,但一般来说,消息仍然在队列中,直到所有订阅者都消耗它或它超时(你也可以控制)
- > DR和Application_A都订阅了多消费者队列QUEUE_MULTI。每个消费者(DR,Application_A)可以消费(每次只消息一次)消息 - 因为消息未过期。所有消费者消费后,该消息都会出列
定义一个多用户队列以传播到另一个队列,只有一个队列可以从中排队。因此,接收的消息被传播到其他队列(可以远程使用DR或其他应用程序的其他用途)。消息传播到队列,并在到达时标记为该队列使用。在所有消费者(包含其他队列)消耗它之前,消息不会被完全消耗
- > DR和Application_A都有自己的队列来使用这些消息。 (QUEUE_DR,QUEUE_A)。定义多消费者队列QUEUE_MULTI。 QUEUE_MULTI传播到QUEUE_DR和QUEUE_A等。一旦消息传播到所有队列,消息将从QUEUE_MULTI消耗,无论相应队列中发生了什么QUEUE_A,QUEUE_DR
答案 1 :(得分: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;
我还没有对代码进行测试,但它应该可行。但是,当只允许单个连接时,不确定应用程序的反应如何!