2015-08-20 3 views
1

Я пытаюсь в первый раз удалить из очереди в моей производственной среде ODP.NET и C#.Очередь очереди Oracle AQ с ODP.NET

Я использовал официальный пример ODP.NET для разработки моего клиента, полученного из папки примеров установки.

Очередь - это тема Oracle AQ (многопользовательская), адресованная многими другими службами компании, написанными на J2EE.

Я написал классы отображения UDT, следуя рекомендациям по разработке ODP (http://docs.oracle.com/cd/E11882_01/win.112/e23174/featUDTs.htm#ODPNT0024).

Проблема заключается в следующем: мой клиент подключается к очереди, при этом он никогда не получает никакого сообщения (другие пользователи, подключенные к ним 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» вид не containt мой абонент «Test_Subscriber_ID».

Спасибо всем!

+0

Посмотрите на эту статью и проверить исходный код, который предоставляется вместе с ним: Статья: http://www.oracle.com/technetwork/issue-archive/2009/ 09-nov/o69net-099734.html Код статьи: http://www.oracle.com/technetwork/issue-archive/2009/09-nov/o69odt-131369.zip Лучше, чем образцы, которые вы нашли. –

+0

UDTs в ODP.NET сложны. Если вы собираетесь использовать их, вы должны начать с использования мастера генерации кода в составе инструментов разработчика Oracle для Visual Studio. https://apex.oracle.com/pls/apex/f?p=44785:24:1323236364075:::24:P24_CONTENT_ID,P24_PROD_SECTION_GRP_ID,P24_PREV_PAGE:10199,,24 –

+0

Пожалуйста, проблема не в UDT, но факт что я никогда не получаю никакого сообщения из очереди. –

ответ

1

Проблема решена! Я пропустил создать на моем собственном абонент по следующему сценарию:

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 создание абонента автоматически!

Большое спасибо, Антонио

Смежные вопросы