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:
1 2
|
CREATE TABLE messages (message RAW(1000), date_created TIMESTAMP); |
Création de la queue de réception
Code:
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:
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:
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:
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:
1 2
|
ORA-27473: argument 1 does not exist |
Merci d'avance pour votre précieuse aide