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
Création de la queue de réception
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CREATE TABLE messages (message RAW(1000), date_created TIMESTAMP);
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
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 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;
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 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;
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
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;
Merci d'avance pour votre précieuse aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ORA-27473: argument 1 does not exist
Partager