Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Oracle AQ主题队列与ODP.NET一起出列_C#_Oracle_Queue_Odp.net_Jms Topic - Fatal编程技术网

C# Oracle AQ主题队列与ODP.NET一起出列

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=;密码=;数据源=”;

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

我使用官方ODP.NET示例开发了从installation examples文件夹获得的客户机

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

我按照ODP开发指南()编写了UDT映射类

问题是:我的客户机连接到队列,因为它从未收到任何消息(其他连接的java客户机收到消息)

以下是我的代码(不含UDT类,请简要说明我的帖子):

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;