C# Oracle AQ主题队列与ODP.NET一起出列
我第一次尝试通过ODP.NET和C#从公司生产环境的队列中退出 我使用官方ODP.NET示例开发了从installation examples文件夹获得的客户机 队列是一个Oracle AQ主题(多消费者),由许多其他使用J2EE编写的公司服务解决 我按照ODP开发指南()编写了UDT映射类 问题是:我的客户机连接到队列,因为它从未收到任何消息(其他连接的java客户机收到消息) 以下是我的代码(不含UDT类,请简要说明我的帖子):C# Oracle AQ主题队列与ODP.NET一起出列,c#,oracle,queue,odp.net,jms-topic,C#,Oracle,Queue,Odp.net,Jms Topic,我第一次尝试通过ODP.NET和C#从公司生产环境的队列中退出 我使用官方ODP.NET示例开发了从installation examples文件夹获得的客户机 队列是一个Oracle AQ主题(多消费者),由许多其他使用J2EE编写的公司服务解决 我按照ODP开发指南()编写了UDT映射类 问题是:我的客户机连接到队列,因为它从未收到任何消息(其他连接的java客户机收到消息) 以下是我的代码(不含UDT类,请简要说明我的帖子): string constr=“用户id=;密码=;数据源=”;
string constr=“用户id=;密码=;数据源=”;
OracleConnection conListen=新的OracleConnection(cont);
OracleQQueue queueListen=新建OracleQQueue(“”,conListen);
尝试
{
conListen.Open();
queueListen.MessageType=OracleqMessageType.Udt;
queueListen.DequeueOptions.ConsumerName=“测试订户ID”;
queueListen.UdtTypeName=“SYS.AQ$\u JMS\u TEXT\u MESSAGE”;
queueListen.DequeueOptions.Visibility=OracleQVisibilityMode.OnCommit;
queueListen.DequeueOptions.Wait=60;
OracleTransaction txn=conListen.BeginTransaction();
oracleqmessage deqMsg=queueListen.Dequeue();
提交();
}
捕获(例外e)
{
WriteLine(“错误:{0}”,e.Message);
}
最后
{
queueListen.Dispose();
conListen.Close();
conListen.Dispose();
}
另一个细节:连接后,“所有队列订阅者”视图不包含我的订阅者“测试订阅者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;
声明
vQueue varchar2(255):='';
vId varchar2(255):=“测试用户ID”;
vSubscriber SYS.AQ$\代理;
开始
vSubscriber:=SYS.AQ$\u代理(vId,null,null);
dbms_aqadm.add_订户(
queue_name=>vQueue,
订户=>vSubscriber,
队列到队列=>false,
交付模式=>DBMS\u AQADM.PERSISTENT
);
/*dbms_aqadm.enable_db_访问(
代理名称=>vId,
db_用户名=>''
);*/
结束;
使用J2EE,订户创建是自动的
非常感谢,,
Antonio看一看这篇文章,并查看它附带的源代码:article:code for article:it比您找到的示例要好。ODP.NET中的udt很棘手。如果要使用它们,您应该首先使用代码生成向导作为Oracle Developer Tools for Visual Studio的一部分。请注意,问题不在于UDTs,而在于我从未从队列中获得任何消息。好的,请查看我为ODP.NET和AQ提供的其他代码,作为一个健全性检查。我看到您正在使用11.2。确保您没有遇到需要修补数据库和客户端的旧错误。请参阅我的答案和解决方法:(这是针对OracleDependency的,但它也会影响AQ,我相信该错误不会影响jdbc)谢谢,我将按照您告诉我的内容来做。谢谢你,马修,请也看看这里。
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;