gpt4 book ai didi

c# - Oracle AQ 主题队列使用 ODP.NET 出队

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:31 25 4
gpt4 key购买 nike

我第一次尝试通过 ODP.NET 和 C# 从我公司生产环境的队列中出队。

我使用官方 ODP.NET 示例来开发我的客户端,该示例从安装示例文件夹中获取。

队列是一个 Oracle AQ 主题(多消费者),由使用 J2EE 编写的许多其他公司服务解决。

我按照 ODP 开发指南 (http://docs.oracle.com/cd/E11882_01/win.112/e23174/featUDTs.htm#ODPNT0024) 编写了 UDT 映射类。

问题是:我的客户端连接到队列,但它从未收到任何消息(其他连接的 java 客户端收到它们)。

这是我的代码(没有 UDT 类,为了保持简短我的帖子):

        string constr = "user id=<USER_ID>;password=<PASSWORD>;data source=<DATASOURCE>";
OracleConnection conListen = new OracleConnection(constr);

OracleAQQueue queueListen = new OracleAQQueue("<TOPIC_QUEUE_ID>", conListen);

try
{
conListen.Open();

queueListen.MessageType = OracleAQMessageType.Udt;
queueListen.DequeueOptions.ConsumerName = "Test_Subscriber_ID";
queueListen.UdtTypeName = "SYS.AQ$_JMS_TEXT_MESSAGE";
queueListen.DequeueOptions.Visibility = OracleAQVisibilityMode.OnCommit;
queueListen.DequeueOptions.Wait = 60;

OracleTransaction txn = conListen.BeginTransaction();

OracleAQMessage deqMsg = queueListen.Dequeue();

txn.Commit();
}
catch (Exception e)
{
Console.WriteLine("Error: {0}", e.Message);
}
finally
{
queueListen.Dispose();
conListen.Close();
conListen.Dispose();
}

另一个细节:连接后“all_queue_subscribers” View 不包含我的订阅者“Test_Subscriber_ID”。

谢谢大家!

最佳答案

问题解决了!我错过了通过以下脚本自行创建订阅者:

declare
vQueue varchar2(255) := '<TOPIC_QUEUE_ID>';
vId varchar2(255) := 'Test_Subscriber_ID';
vSubscriber SYS.AQ$_AGENT;
begin
vSubscriber := SYS.AQ$_AGENT(vId, null, null);

dbms_aqadm.add_subscriber(
queue_name => vQueue,
subscriber => vSubscriber,
queue_to_queue => false,
delivery_mode => DBMS_AQADM.PERSISTENT
);

/*dbms_aqadm.enable_db_access(
agent_name => vId,
db_username => '<USER_ID>'
);*/
end;

使用 J2EE,订阅者创建是自动的!

非常感谢,安东尼奥

关于c# - Oracle AQ 主题队列使用 ODP.NET 出队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32122164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com