Oracle AQ para trabalhos agendados

0

Temos um processo que atualmente usa o Oracle DBMS_SCHEDULER para executar. O processo é executado sempre que o back-end recebe dados de um dispositivo externo. O planejador Oracle é configurado para que um trabalho seja criado na recepção de dados externos, o trabalho seja executado imediatamente e o trabalho seja destruído automaticamente quando concluído.

O problema aqui é que vários dispositivos podem estar enviando dados ao mesmo tempo. Como o processo envolve a obtenção de bloqueios exclusivos em pontos diferentes durante a execução, ocasionalmente um trabalho é executado em outro que já está em execução (é rejeitado com o ORA-20000).

Gostaria de usar de alguma forma o mechansim do Oracle AQ (fila avançada) para resolver esse problema. Eu imagino uma fila de trabalhos que são executados FIFO. Mesmo que o dispositivo externo B envie dados enquanto o processo está processando dados do dispositivo externo A, a fila impede o processamento de dados do dispositivo B até que o processamento do dispositivo A seja concluído.

Não parece haver uma seção específica sobre esse tipo de processamento de AQ na documentação do Oracle, mas parece que seria um cenário bastante comum. Alguém mais resolveu esse tipo de problema com o Oracle AQ?

mlehmeher
fonte

Respostas:

0

Você pode implementá-lo assim: O programa de trabalho do planejador é implementado como um loop infinito - nunca falha. Esse loop retira as mensagens do AQ e as processa. O trabalho do planejador é enviado apenas uma vez - até o sistema de eventos ser acionado AFTER STARTUP ON DATABASE.

Ele não usa nenhuma cadeia de agendador nem outras opções avançadas do agendador. Simplesmente o trabalho do agendador é acionado pelo gatilho quando o banco de dados inicia, o trabalho "nunca termina" .

Mas acho que o dbms_scheduler é muito poderoso hoje em dia e existem maneiras de limitar as execuções paralelas para um agendamento.

PS: ORA-20000 é um código de erro definido pelo usuário. O banco de dados nunca retorna esse erro sozinho.

ibre5041
fonte
Você pode fornecer um exemplo (pseudo-código ou similar) de como isso pode funcionar com o trabalho agendado sem fim que você mencionou? por exemplo, como o mecanismo de AQ seria configurado e como você impediria a execução simultânea de mais de um processo? Isso seria uma limitação definida no trabalho ou no AQ mechansim?
mlehmeher