标签: oracle-aq

如何清除Oracle AQ中的队列

我第一次测试Oracle AQ.我已经设法在我创建的队列中创建了2000行测试插入.

现在,我想清除那些.在我自学的时候,我将到期时间定为一个月.我不能等那么久.我不认为我应该从队列表中删除它们.

最好的方法是什么?

oracle queue jms oracle-aq

20
推荐指数
1
解决办法
6万
查看次数

从哪里获取11.2.0.3的Oracle jar文件 - xdb,aq,i18n,xmlparser

我正在尝试更新旧版Java应用程序以与Oracle 11g版本11.2.0.3兼容.

该应用程序在Oracle 10g版本10.2.0.4上运行,并使用Oracle Advanced Queues.它具有声明的Maven依赖项:

  • aq 10.2.0.4.0
  • xdb 10.2.0.4.0
  • xmlparser 10.2.0.4.0
  • i18n 10.2.0.4.0

我很难找到11g的相同文件,特别是11.2.0.3.我在各种各样的地方环顾四周,比如我的Oracle主目录,JDeveloper安装和在线,并找到了各种各样名称和版本的令人眼花缭乱的jar文件,这些文件是候选人但不是我需要的.

任何人都可以让我知道在哪里找到合适的jar文件?

现在看来aqJDBC驱动程序中有一些类,但包名已从更改oracle.aqoracle.jdbc.aq.虽然我很乐意做一些重构,但我还是有信心在开始之前这是正确的做法.这里的任何建议都很有价值.

编辑: 当尝试使用mish-mash版本运行时,我设法发现在尝试运行apps单元测试时出现以下错误:

java.lang.NoSuchMethodError: oracle.i18n.text.converter.CharacterConverterOGS.getInstance(I)Loracle/i18n/text/converter/CharacterConverter;
at oracle.sql.converter.CharacterConverterFactoryOGS.make(CharacterConverterFactoryOGS.java:43)
at oracle.sql.CharacterSetWithConverter.getInstance(CharacterSetWithConverter.java:97)
at oracle.sql.CharacterSetFactoryThin.make(CharacterSetFactoryThin.java:129)
at oracle.sql.CharacterSet.make(CharacterSet.java:514)
at oracle.sql.CHAR.<clinit>(CHAR.java:72)
Run Code Online (Sandbox Code Playgroud)

编辑: 通过下载orai18n.jarxdb6.jarOracle的Oracle Database 11g第2版JDBC驱动程序页面下载来管理以解决导致单元测试错误的问题.但是,我仍然缺乏aqxmlparser.

编辑: 找到看起来很有希望获得的Oracle XDK主页xmlparser,但在明显的地方没有可用的下载.

java jdbc oracle11g oracle-xdk oracle-aq

8
推荐指数
1
解决办法
2万
查看次数

在启动时启动oracle dequeue

我收到了Oracle的以下错误,

ORA-25226: dequeue failed, queue string.string is not enabled for dequeue
Run Code Online (Sandbox Code Playgroud)

以下是官方文件中的原因和行动:

Cause: The queue has not been enabled for dequeue.
Action: Enable the queue using START_QUEUE.
Run Code Online (Sandbox Code Playgroud)

但是每次重启数据库时都会发生此错误,是否有任何配置设置为启动数据库启动时出队?

谢谢!

database oracle oracle-aq

7
推荐指数
1
解决办法
2万
查看次数

Oracle AQ相同的消息提供两次

我在oracle中创建了一个AQ,并用Java编写了2个JMS使用者来监听队列.我有时观察到如果我在队列中产生一些消息; 队列中出队消息的计数大于排队的消息数.这意味着一些消息被消耗了两次.

我用属性创建了队列: - multiple_consumers => FALSE

JMS的消费者正在努力 CLIENT_ACKNOWLEDGE mode

请帮助我了解这种行为的可能原因及其解决方案.因此,我可以复制问题并解决上述问题,并确保排队的消息数等于多个JMS消费者收听同一AQ时出列的消息数.

oracle jms oracle-aq

7
推荐指数
1
解决办法
1130
查看次数

如何使用Java将JMS消息排入Oracle AQ

我有一个Oracle AQ,队列类型为SYS.AQ $ _JMS_TEXT_MESSAGE.我想要做的是从java应用程序中将文本插入到提到的队列中.

等效的SQL查询是

declare
 r_enqueue_options    DBMS_AQ.ENQUEUE_OPTIONS_T;
 r_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
 v_message_handle     RAW(16);
 o_payload            SYS.AQ$_JMS_TEXT_MESSAGE;
begin
 o_payload := sys.aq$_jms_text_message.construct;
 o_payload.set_text(xmltype('<user>text</user>').getClobVal());
 sys.dbms_aq.enqueue (
   queue_name         => 'QUEUE_NAME',
   enqueue_options    => r_enqueue_options,
   message_properties => r_message_properties,
   payload            => o_payload,
   msgid              => v_message_handle
 );
 commit;
end;
/
Run Code Online (Sandbox Code Playgroud)

我使用本指南得到了大部分权利,但我坚持了下来

 o_payload := sys.aq$_jms_text_message.construct;
 o_payload.set_text(xmltype('<user>text</user>').getClobVal());
Run Code Online (Sandbox Code Playgroud)

该指南显示了如何排队RAW消息,但我需要它是JMS,否则数据类型与队列类型不匹配.

任何帮助将不胜感激,因为即使有全能的谷歌我也无法找到解决这个问题的方法.有没有办法使用oracle.jdbc.aq类来实现它,或者我只需要搞砸它并使用SQL查询?

java jms oracle-aq

5
推荐指数
1
解决办法
1万
查看次数

Oracle AQ - 队列消息复制

我们正在升级我们的基础架构,为此我们将从Oracle 10g迁移到11g.

我们使用Oracle GoldenGate进行数据复制,据我们所知,它不支持AQ消息的复制.

对于持久队列,我们​​有可用的导入/导出选项.但是有一些缓冲队列也需要复制.

任何人都可以指导我们如何在这种情况下避免数据丢失.

感谢任何帮助.

oracle oracle10g oracle11g oracle-aq oracle-golden-gate

5
推荐指数
1
解决办法
865
查看次数

Oracle Advance Queue - Dequeue无法正常工作

我似乎无法找到问题的解决方案,我已经坚持了几个小时.

我正在使用Oracle AQ:

       Dbms_Aqadm.Create_Queue_Table(Queue_Table        => 'ITEM_EVENT_QT',
                                    Queue_Payload_Type => 'ITEM_EVENT',
                                    Multiple_Consumers => TRUE);

       Dbms_Aqadm.Create_Queue(Queue_Name          => 'ITEM_EVENT_QUEUE',
                              Queue_Table         => 'ITEM_EVENT_QT',
                              Max_Retries         => 5,
                              Retry_Delay         => 0,
                              Retention_Time      => 432000, -- 5 DAYS
                              Dependency_Tracking => FALSE,
                              COMMENT             => 'Item Event Queue');
       -- START THE QUEUE
       Dbms_Aqadm.Start_Queue('ITEM_EVENT_QUEUE');
       -- GRANT QUEUE PRIVILEGES
       Dbms_Aqadm.Grant_Queue_Privilege(Privilege    => 'ALL',
                                       Queue_Name   => 'ITEM_EVENT_QUEUE',
                                       Grantee      => 'PUBLIC',
                                       Grant_Option => FALSE);
    END;
Run Code Online (Sandbox Code Playgroud)

这是我的一位订阅者:

Dbms_Aqadm.Add_Subscriber(Queue_Name => 'ITEM_EVENT_QUEUE',
                            Subscriber => Sys.Aq$_Agent('ITEM_SUBSCRIBER_1',
                                                        NULL,
                                                        NULL),
                            rule   =>  'tab.user_data.header.thread_no = 1');

   Dbms_Aq.Register(Sys.Aq$_Reg_Info_List(Sys.Aq$_Reg_Info('ITEM_EVENT_QUEUE:ITEM_SUBSCRIBER_1',
                                                          Dbms_Aq.Namespace_Aq,
                                                          'plsql://ITEM_API.GET_QUEUE_FROM_QUEUE',
                                                          HEXTORAW('FF'))),1);
Run Code Online (Sandbox Code Playgroud)

订户注册:

每当我的数据库上发生某个事件时,我使用触发器通过从我的 …

oracle plsql oracle-aq

5
推荐指数
1
解决办法
8121
查看次数

dbms_aq.dequeue_array,第一条消息返回两次

介绍

使用Oracle Advanced Queuing方法时,我在Oracle SQL Server上遇到了一个非常奇怪的行为(确切地说:Oracle Database 11g企业版11.2.0.4.0版 - 64位生产版).

问题

错误是我排队X消息,但dequeue_array返回X + 1消息,第一条消息重复(如MessageId所示).

复制:

我能够编写一些简单的PoC来重现错误.本代码非常简单,入队/出队的东西是标准的Oracle AQ.代码执行以下步骤两次(测试运行):

  • 清除队列表
  • 排队X消息
  • 使用dbms_aq.dequeue_array调用使所有消息出列
  • 检查已出列的消息数

在新连接上运行POC时,第一次运行成功而没有错误,但每次后续运行都失败.之后,当使用相同的连接时,每次执行脚本时,它都会在两次测试运行中失败.

到目前为止我尝试了什么:

  • 在"新"连接上运行此脚本:仅第一次运行失败
  • 在同一连接上执行脚本的任何其他操作:所有运行失败
  • 使用/创建新队列时:只有第一次运行失败
  • 使用"delete from <queue_table>"而不是dbms_aqadm.purge_queue_table():一切都很好
  • 当使用"正常"一个一个出列时:每次都很好

结论:

我既不能解释这种行为,也不能在我的代码中找到错误.请看一下它,它应该可以在你最喜欢的sql客户端中直接执行(用PL/SQL Developer测试).

如果您需要任何进一步的信息或在让PoC工作时遇到问题,请问,我会定期检查这个帖子.我试图使PoC尽可能可读,包括关于正在发生的事情的详细输出.

码:

declare
   C_QueueName        constant varchar2(32767) := 'TEST_QUEUE';
   C_QueueTable       constant varchar2(32767) := 'TEST_Q_TABLE';
   C_MsgCount         constant pls_integer := 1;
   C_TestRuns         constant pls_integer := 2;
   C_DequeueArraySize constant pls_integer := 10;

   /*
    * Create the queue and the queue table used for theses tests …
Run Code Online (Sandbox Code Playgroud)

oracle plsql oracle11g oracle-aq

5
推荐指数
1
解决办法
1135
查看次数

LDAP:错误代码 49 - 无法绑定 principalDn

我是 ApacheDS 的新手。我刚刚在 ApcheDS 中创建了一个新分区。当我尝试注册我的连接工厂时,出现上述错误..(使用 OracleAQ)

我的代码是;

    // ldap settings
        env.put(Context.INITIAL_CONTEXT_FACTORY, AQjmsConstants.INIT_CTX_FACTORY);
        env.put(Context.PROVIDER_URL, "ldap://localhost:10389/");
            env.put(Context.SECURITY_PRINCIPAL, "uid=admin,ou=system,dc=acme,dc=com"); 
        env.put(Context.SECURITY_CREDENTIALS, "secret");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
Run Code Online (Sandbox Code Playgroud)

我的 LDIF 文件看起来像;

dn: dc=acme,dc=com
objectClass: organization
objectClass: dcObject
objectClass: top
dc: acme
o: Acme,Inc

dn: cn=OracleContext,dc=acme,dc=com
objectClass: orclContext
objectClass: top
cn: OracleContext

dn: cn=db1,cn=OracleContext,dc=acme,dc=com
objectClass: orclContext
objectClass: top
cn: db1

dn: cn=OracleDBConnections,cn=db1,cn=OracleContext,dc=acme,dc=com
objectClass: orclContext
objectClass: top
cn: OracleDBConnections

dn: cn=OracleDBQueue,cn=db1,cn=OracleContext,dc=acme,dc=com
objectClass: orclContext
objectClass: top
cn: OracleDBQueue
Run Code Online (Sandbox Code Playgroud)

我的连接参数有什么问题?任何帮助将不胜感激?

谢谢,

ldap ldapconnection apacheds oracle-aq

4
推荐指数
1
解决办法
6935
查看次数

如何在Java提交时排队入Oracle AQ表并通过JMS客户端使用

我正在为企业级产品编写Java组件,并希望利用Oracle 11g数据库的特定功能Active Queues。我要完成的确切场景是-1.在提交时向oracle活动队列/队列表中写入一条消息2.使用JMS使用者从队列中读取该消息

我在http://docs.oracle.com/cd/B28359_01/java.111/b31224/streamsaq.htm上观看了演示和教程。

特别是,我想重点介绍代码的入队部分-

    // Create the actual AQMessage instance:
    AQMessage mesg = AQFactory.createAQMessage(msgprop);
    // and add a payload:
    byte[] rawPayload = new byte[500];
    for (int i = 0; i < rawPayload.length; i++) {
        rawPayload[i] = 'b';
    }

    mesg.setPayload(new RAW(rawPayload));

    AQEnqueueOptions opt = new AQEnqueueOptions();
    opt.setRetrieveMessageId(true);
    opt.setDeliveryMode(AQEnqueueOptions.DeliveryMode.PERSISTENT);
    opt.setVisibility(AQEnqueueOptions.VisibilityOption.ON_COMMIT);

    // execute the actual enqueue operation:
    conn.enqueue(queueName, opt, mesg);
Run Code Online (Sandbox Code Playgroud)

这对我来说效果很好,因为我们要确保仅在提交事务后,该消息才对消费者可见。

问题-在演示中,我们创建有效负载类型RAW的队列

doUpdateDatabase(conn,
           "BEGIN "+
           "DBMS_AQADM.CREATE_QUEUE_TABLE( "+
           "   QUEUE_TABLE        =>  '"+USERNAME+".RAW_SINGLE_QUEUE_TABLE',  "+
           "   QUEUE_PAYLOAD_TYPE =>  'RAW', "+
           "   COMPATIBLE         => …
Run Code Online (Sandbox Code Playgroud)

java oracle jms oracle-aq

3
推荐指数
1
解决办法
5004
查看次数