我第一次测试Oracle AQ.我已经设法在我创建的队列中创建了2000行测试插入.
现在,我想清除那些.在我自学的时候,我将到期时间定为一个月.我不能等那么久.我不认为我应该从队列表中删除它们.
最好的方法是什么?
我正在尝试更新旧版Java应用程序以与Oracle 11g版本11.2.0.3兼容.
该应用程序在Oracle 10g版本10.2.0.4上运行,并使用Oracle Advanced Queues.它具有声明的Maven依赖项:
我很难找到11g的相同文件,特别是11.2.0.3.我在各种各样的地方环顾四周,比如我的Oracle主目录,JDeveloper安装和在线,并找到了各种各样名称和版本的令人眼花缭乱的jar文件,这些文件是候选人但不是我需要的.
任何人都可以让我知道在哪里找到合适的jar文件?
现在看来aq
JDBC驱动程序中有一些类,但包名已从更改oracle.aq
为oracle.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.jar
和xdb6.jar
从Oracle的Oracle Database 11g第2版JDBC驱动程序页面下载来管理以解决导致单元测试错误的问题.但是,我仍然缺乏aq
和xmlparser
.
编辑:
找到看起来很有希望获得的Oracle XDK主页xmlparser
,但在明显的地方没有可用的下载.
我收到了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)
但是每次重启数据库时都会发生此错误,是否有任何配置设置为启动数据库启动时出队?
谢谢!
我在oracle中创建了一个AQ,并用Java编写了2个JMS使用者来监听队列.我有时观察到如果我在队列中产生一些消息; 队列中出队消息的计数大于排队的消息数.这意味着一些消息被消耗了两次.
我用属性创建了队列: - multiple_consumers => FALSE
JMS的消费者正在努力 CLIENT_ACKNOWLEDGE mode
请帮助我了解这种行为的可能原因及其解决方案.因此,我可以复制问题并解决上述问题,并确保排队的消息数等于多个JMS消费者收听同一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查询?
我们正在升级我们的基础架构,为此我们将从Oracle 10g迁移到11g.
我们使用Oracle GoldenGate进行数据复制,据我们所知,它不支持AQ消息的复制.
对于持久队列,我们有可用的导入/导出选项.但是有一些缓冲队列也需要复制.
任何人都可以指导我们如何在这种情况下避免数据丢失.
感谢任何帮助.
我似乎无法找到问题的解决方案,我已经坚持了几个小时.
我正在使用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 Advanced Queuing方法时,我在Oracle SQL Server上遇到了一个非常奇怪的行为(确切地说:Oracle Database 11g企业版11.2.0.4.0版 - 64位生产版).
错误是我排队X消息,但dequeue_array返回X + 1消息,第一条消息重复(如MessageId所示).
我能够编写一些简单的PoC来重现错误.本代码非常简单,入队/出队的东西是标准的Oracle AQ.代码执行以下步骤两次(测试运行):
在新连接上运行POC时,第一次运行成功而没有错误,但每次后续运行都失败.之后,当使用相同的连接时,每次执行脚本时,它都会在两次测试运行中失败.
我既不能解释这种行为,也不能在我的代码中找到错误.请看一下它,它应该可以在你最喜欢的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) 我是 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)
我的连接参数有什么问题?任何帮助将不胜感激?
谢谢,
我正在为企业级产品编写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)