IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Consommation des messages dans Oracle Queue Advance


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 196
    Points : 89
    Points
    89
    Par défaut Consommation des messages dans Oracle Queue Advance
    Bonjour,

    Je tente actuellement de détecter l'arrivée de message dans des queues Oracle.
    Un fois détecter je récupère le message afin de l'insérer dans une table.

    Création de la table de réception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE TABLE messages (message RAW(1000), date_created TIMESTAMP);
    Création de la queue de réception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    DECLARE
       l_q_name              CONSTANT VARCHAR2 (30) := 'MY_QUEUE';
       l_payload_type_name   CONSTANT VARCHAR2 (30) := 'RAW';
    BEGIN
            DBMS_AQADM.create_queue_table (
            QUEUE_TABLE                  => l_q_name,
            QUEUE_PAYLOAD_TYPE     => l_payload_type_name,
            MULTIPLE_CONSUMERS     => TRUE,
            COMMENT              => 'My queue');
            DBMS_AQADM.create_queue (
            QUEUE_NAME       => l_q_name,
            QUEUE_TABLE      => l_q_name,
            RETENTION_TIME => 86400, /*24 hours in seconds*/
            COMMENT          => 'My queue');
            DBMS_AQADM.start_queue (queue_name => l_q_name);
       COMMIT;
    END;

    Création du package et du process de traitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    CREATE OR REPLACE PACKAGE MY_PACKAGE
    AS
       PROCEDURE PROCESS_Q_MSG (p_msg_o IN RAW);
    END MY_PACKAGE;
    /
    CREATE OR REPLACE PACKAGE BODY MY_PACKAGE
    AS
       PROCEDURE PROCESS_Q_MSG (p_msg_o IN RAW)
       IS
       BEGIN
          INSERT INTO messages (message, date_created) 
          VALUES (p_msg_o, SYSTIMESTAMP);
       END PROCESS_Q_MSG;
    END MY_PACKAGE;
    Création du scheduler et du job qui intercepte le message dans la queue et le met dans la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    BEGIN
      DBMS_SCHEDULER.create_program (
                              program_name          => 'my_program_p',
                              program_action        => 'MY_PACKAGE.PROCESS_Q_MSG',
                              program_type          => 'stored_procedure',
                              number_of_arguments   => 1,
                              enabled               => FALSE);
     
       DBMS_SCHEDULER.define_metadata_argument 
                             ('my_program_p', 'event_message', 1);
     
       DBMS_SCHEDULER.enable ('my_program_p');
     
       DBMS_SCHEDULER.create_job (
                                      job_name       => 'my_job_y',
                                      program_name   => 'my_program_p',
                                      queue_spec     => 'MY_QUEUE',
                                      enabled        => FALSE);
     
       DBMS_SCHEDULER.set_attribute ('my_job_y', 'parallel_instances', TRUE);
     
       DBMS_SCHEDULER.enable ('my_job_y');
    END;
    Insertion du message dans la queue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    DECLARE 
       enqueue_options     dbms_aq.enqueue_options_t; 
       message_properties  dbms_aq.message_properties_t; 
       message_handle      RAW(16); 
       message             RAW(4096); 
       queue_name      CONSTANT VARCHAR2 (30) := 'MY_QUEUE';
     
    BEGIN 
       message :=   utl_raw.cast_to_raw('<person_type>6</person_type><last_name>STARKYSIAN</last_name><first_name>Kara</first_name><name_at_birth>Tully</name_at_birth><date_of_birth>01/03/1970</date_of_birth><title>MS.</title><gender>F</gender><country_of_birth>FR</country_of_birth><place_of_birth>Metz</place_of_birth><nationality_1>FR</nationality_1><civil_status>S</civil_status><event>Birth</event><creator>208144</creator><creation_date>13/08/2015</creation_date><start_date>01/03/2015</start_date>');
       DBMS_AQ.ENQUEUE(
               queue_name => queue_name,            
               enqueue_options    => enqueue_options,        
               message_properties => message_properties,      
               payload  => message,                
               msgid   => message_handle);
        message :=   utl_raw.cast_to_raw('<person_type>6</person_type><last_name>STARKYSIAN</last_name><first_name>Kara</first_name><name_at_birth>Tully</name_at_birth><date_of_birth>01/03/1970</date_of_birth><title>MS.</title><gender>F</gender><country_of_birth>FR</country_of_birth><place_of_birth>Metz</place_of_birth><nationality_1>FR</nationality_1><civil_status>S</civil_status><event>Birth</event><creator>208144</creator><creation_date>13/08/2015</creation_date><start_date>01/03/2015</start_date>');
       DBMS_AQ.ENQUEUE(
               queue_name => queue_name,            
               enqueue_options    => enqueue_options,        
               message_properties => message_properties,      
               payload  => message,                
               msgid   => message_handle);       
       COMMIT; 
    END;
    Lorsque que je vérifie la queue les messages sont présents par contre la table reste vide et j'ai le message d'erreur suivant dans la table : ALL_SCHEDULER_JOB_RUN_DETAILS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORA-27473: argument 1 does not exist
    Merci d'avance pour votre précieuse aide

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Sans vraiment étudier votre exemple je pense que le problème devrait se situer à ce niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     DBMS_SCHEDULER.define_metadata_argument 
                             ('my_program_p', 'event_message', 1);
    Lisez aussi introduction to advanced queuing

Discussions similaires

  1. Réponses: 5
    Dernier message: 07/06/2006, 12h11
  2. Réponses: 2
    Dernier message: 05/05/2006, 14h49
  3. réception des messages dans un chat en tcp
    Par je®ome dans le forum Réseau
    Réponses: 9
    Dernier message: 25/04/2006, 17h48
  4. Modification des YES en Oui et des messages dans dlg
    Par netchip dans le forum Langage
    Réponses: 11
    Dernier message: 15/04/2006, 14h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo